14

我的基本任务是在 android 中创建一个原生服务,然后编写一个简单的原生程序来测试它。假设我想编写一个简单的服务,它返回两个整数的总和。我必须使用活页夹从程序中与之交谈,我试图用谷歌搜索,但找不到一个精确的例子。我需要知道如何创建本机服务并在程序中找到它,如果需要,还需要在 Java 中找到它。

4

3 回答 3

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 域套接字
  • 使用 Android SDK 的常规Service和 AIDL 工具在 Java 中执行此操作。如果您希望将其与本机代码结合使用,您可以使用 JNI 从本机代码调用 Java。
  • (不推荐)从 Android 开源项目中复制相关的库和头文件;构建到您的 NDK 项目中;并使用 API。但是,这不受官方支持,并且极有可能在将来的版本中破坏您的应用程序,因为 Google 没有义务维护此类库的兼容性(并且通常不会)。这也很困难,因为您需要找到某种方法来注册服务,以便客户端可以找到它。
于 2013-01-11T10:31:45.233 回答
11

我找到的解决方案是在本机中使用 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

于 2013-01-11T11:21:55.253 回答
5

在@Android NDK 学习和编码之后,我发现Binder API在Android NDK 中是不可用的。而且即使你使用android开源来调用binder api,也许你会因为binder安全检查而被拒绝。

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

于 2014-03-05T03:43:44.050 回答