web-dev-qa-db-ja.com

Android=ネイティブサービスを作成し、バインダーを使用してそれと通信する方法

私の基本的なタスクは、Androidでネイティブサービスを作成し、それをテストする簡単なネイティブプログラムを作成することです。 2つの整数の合計を返す単純なサービスを書きたいとしましょう。プログラムからそれと話すにはバインダーを使用する必要があります。グーグルで検索しようとしましたが、正確な例が見つかりません。ネイティブサービスを作成してプログラムで見つける方法と、必要に応じてJavaでも見つける方法を知る必要があります。

12

私が見つけた解決策は、ネイティブでバインダーを使用し、

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

11

NDKを使用して通常のAndroidアプリケーションを作成している場合、バインダーはNDK APIの一部ではないため使用できません。

NDK docs/STABLE-APIS.htmlで安定したAPIの完全なリストを確認し、このスレッドで、BinderはサポートされているAPIではないというDavid Turner(NDKメンテナー)による明示的なコメントを探してください。

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

オプションは次のとおりです。

  • ネイティブコードで他の形式のIPCを使用する-たとえば、UNIXドメインソケット
  • Android SDKの通常のServiceおよびAIDL機能を使用して、Javaで実行します。これをネイティブコードと組み合わせる場合は、JNIを使​​用してネイティブコードから最大Javaを呼び出すことができる場合があります。
  • (非推奨)Androidオープンソースプロジェクトから関連するライブラリとヘッダーをコピーします。 NDKプロジェクトにビルドします。 APIを使用します。ただし、これは公式にはサポートされておらず、Googleにはそのようなライブラリの互換性を維持する義務がないため(多くの場合はそうではありません)、将来のリリースでアプリケーションが機能しなくなる可能性が非常に高くなります。また、クライアントがサービスを見つけられるようにサービスを登録する方法を見つける必要があるため、これも非常に困難です。
13
Adrian Taylor

@ Android NDKを調査してコーディングした後、バインダーAPIは[〜#〜]ではない[〜#〜]Android NDKで利用できます。また、AndroidバインダーAPIを呼び出すためのオープンソースを使用している場合でも、バインダーのセキュリティチェックのため、アクセスが拒否されました

ここで、システムサービスにサービスを追加する場合は、システムレベルのユーザーグループが必要です。あなたが見つけることができる詳細コード https://github.com/qianjigui/Android_system_service_example 。 CとJava=レベルのクライアントとサービスが含まれていますが、システム権限が必要です。

4
QJGui