14

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

4

3 に答える 3

13

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

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

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

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

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

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

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 を勉強してコーディングした後、バインダー API がAndroid NDK で利用できないことがわかりました。また、バインダー API の呼び出しに android オープン ソースを使用している場合でも、バインダーのセキュリティ チェックが原因でアクセス許可が拒否される可能性があります。

ここで、システム サービスにサービスを追加するには、システム レベルのユーザー グループが必要です。詳細コードはhttps://github.com/qianjigui/android_system_service_exampleにあります。C および Java レベルのクライアントとサービスが含まれていますが、システム権限が必要です。

于 2014-03-05T03:43:44.050 に答える