【发布时间】:2012-12-22 08:01:04
【问题描述】:
我的基本任务是在 android 中创建一个原生服务,然后编写一个简单的原生程序来测试它。假设我想编写一个简单的服务,它返回两个整数的总和。我必须使用活页夹从程序中与之交谈,我试图用谷歌搜索,但找不到一个精确的例子。我需要知道如何创建本机服务并在程序中找到它,如果需要,还需要在 Java 中找到它。
【问题讨论】:
标签: android c++ android-service android-binder
我的基本任务是在 android 中创建一个原生服务,然后编写一个简单的原生程序来测试它。假设我想编写一个简单的服务,它返回两个整数的总和。我必须使用活页夹从程序中与之交谈,我试图用谷歌搜索,但找不到一个精确的例子。我需要知道如何创建本机服务并在程序中找到它,如果需要,还需要在 Java 中找到它。
【问题讨论】:
标签: android c++ android-service android-binder
如果您使用 NDK 创建普通的 Android 应用程序,则不能使用 Binder,因为它不是 NDK API 的一部分。
在 NDK 文档/STABLE-APIS.html 中查看完整的稳定 API 列表,并在此线程中查看 David Turner(NDK 维护者)关于 Binder 不是受支持的 API 的明确评论。
https://groups.google.com/forum/?fromgroups=#!topic/android-ndk/1QmVRrNckfM
您的选择是:
Service 和 AIDL 工具进行操作。如果您希望将其与本机代码结合使用,您可以使用 JNI 从本机代码调用 Java。【讨论】:
我找到的解决方案是在本机中使用Binders并使用
defaultServiceManager()->addService(
String16("TestService"),new CalcService());
然后使用活页夹并在客户端使用以下内容。
sp<IServiceManager> sm = defaultServiceManager();
sp<IBinder> binder = sm->getService(String16("TestService"));
我在这里找到了有关如何执行此操作的示例: https://github.com/gburca/BinderDemo/blob/master/binder.cpp
【讨论】:
在@Android NDK 学习和编码后,我发现Binder API NOT在Android NDK 中可用。 而且即使你使用android开源来调用binder api,也可能会因为binder安全检查而得到permission denied。
这里如果我想添加一个服务到系统服务,我需要一个系统级的用户组。详细代码您可以找到https://github.com/qianjigui/android_system_service_example。它包含C和Java级别的客户端和服务,但需要系统权限。
【讨论】: