如何在JNI下实现Java接口

时间:2016-03-09 03:40:15

标签: android android-ndk java-native-interface

我希望我的本机代码与Android上的Java代码完全相同:

Intent i = new Intent(); 
i.setClassName("com.example.someservice", "com.example.someservice.service"); 
bindService(i, clientConnection, Context.BIND_AUTO_CREATE);

但是clientConnection是Java中的ServiceConnection接口。我怎么能用c本机代码实现接口?

1 个答案:

答案 0 :(得分:1)

您不能使用Binder,因为它不是NDK API的一部分。

查看NDK docs / STABLE-APIS.html以获取稳定API的完整列表,并查看this thread以获得David Turner(NDK维护者)明确评论Binder不是受支持的API。

您的选择是:

  • 在本机代码中使用其他形式的IPC - 例如UNIX域套接字
  • 使用Android SDK的普通Service和AIDL工具在Java中执行此操作。如果您希望将其与本机代码结合使用,则可以使用JNI从本机代码调用Java。
  • (不推荐)从Android开源项目中复制相关的库和标题;建立你的NDK项目;并使用API​​。然而,这不是官方支持的,并且极有可能在将来的版本中破坏您的应用程序,因为Google没有义务在这些库中保持兼容性(并且经常不这样做)。这也很困难,因为您需要找到一些方法来注册服务,以便客户端可以找到它。