如何创建Android本机服务并使用binder与之通信?

Vin*_*y99 12 c++ android android-service android-binder

我的基本任务是在android中创建本机服务,然后编写一个简单的本机程序来测试它.让我说我想写一个简单的服务,它返回2个整数的总和.我必须使用粘合剂从程序中与它交谈,我试图谷歌,但我找不到一个确切的例子.我需要知道如何创建本机服务并在程序中找到它,如果需要也可以在Java中找到它.

Adr*_*lor 13

如果您使用NDK创建普通的Android应用程序,则无法使用Binder,因为它不是NDK API的一部分.

查看NDK docs/STABLE-APIS.html以获取稳定API的完整列表,以及此线程由David Turner(NDK维护者)明确评论Binder不是受支持的API.

https://groups.google.com/forum/?fromgroups=#!topic/android-ndk/1QmVRrNckfM

你的选择是:

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


Vin*_*y99 11

我找到的解决方案是在本机中使用Binders并使用

defaultServiceManager()->addService(
        String16("TestService"),new CalcService());
Run Code Online (Sandbox Code Playgroud)

然后使用绑定器并在客户端使用以下.

sp<IServiceManager> sm = defaultServiceManager();
sp<IBinder> binder = sm->getService(String16("TestService"));
Run Code Online (Sandbox Code Playgroud)

我在这里找到了如何执行此操作的示例:https: //github.com/gburca/BinderDemo/blob/master/binder.cpp

  • @myCodeHurts:构建AOSP时可以使用libbinder.so.我不认为它在NDK中可用. (3认同)

QJG*_*Gui 5

在对@Android NDK 进行学习和编码后,我发现Android NDK 中没有Binder API 。即使你使用android开源来调用binder api,你可能会因为binder安全检查而被拒绝

这里如果我想在系统服务中添加一个服务,我需要一个系统级用户组。详细代码可以在https://github.com/qianjigui/android_system_service_example找到。它包含 C 和 Java 级别的客户端和服务,但您需要系统权限。