我的基本任务是在 android 中创建一个原生服务,然后编写一个简单的原生程序来测试它。假设我想编写一个简单的服务,它返回两个整数的总和。我必须使用活页夹从程序中与之交谈,我试图用谷歌搜索,但找不到一个精确的例子。我需要知道如何创建本机服务并在程序中找到它,如果需要,还需要在 Java 中找到它。
3 回答
如果您使用 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 域套接字
- 使用 Android SDK 的常规
Service
和 AIDL 工具在 Java 中执行此操作。如果您希望将其与本机代码结合使用,您可以使用 JNI 从本机代码调用 Java。 - (不推荐)从 Android 开源项目中复制相关的库和头文件;构建到您的 NDK 项目中;并使用 API。但是,这不受官方支持,并且极有可能在将来的版本中破坏您的应用程序,因为 Google 没有义务维护此类库的兼容性(并且通常不会)。这也很困难,因为您需要找到某种方法来注册服务,以便客户端可以找到它。
我找到的解决方案是在本机中使用 Binder 并使用
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在Android NDK 中是不可用的。而且即使你使用android开源来调用binder api,也许你会因为binder安全检查而被拒绝。
这里如果我想给系统服务添加一个服务,我需要一个系统级的用户组。详细代码可以在https://github.com/qianjigui/android_system_service_example找到。它包含C和Java级别的客户端和服务,但需要系统权限。