【问题标题】:How to Create a android native service and use binder to communicate with it?如何创建一个 android 原生服务并使用 binder 与之通信?
【发布时间】:2012-12-22 08:01:04
【问题描述】:

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

【问题讨论】:

    标签: android c++ android-service android-binder


    【解决方案1】:

    如果您使用 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

    您的选择是:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我找不到 libbinder.so 进行链接?你是怎么解决的?
      • @myCodeHurts:libbinder.so 在构建 AOSP 时可用。我认为它在 NDK 中不可用。
      【解决方案3】:

      在@Android NDK 学习和编码后,我发现Binder API NOT在Android NDK 中可用。 而且即使你使用android开源来调用binder api,也可能会因为binder安全检查而得到permission denied

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-07
      • 1970-01-01
      • 1970-01-01
      • 2011-10-31
      相关资源
      最近更新 更多