私の基本的なタスクは、Android でネイティブ サービスを作成し、それをテストするための簡単なネイティブ プログラムを作成することです。2 つの整数の合計を返す単純なサービスを書きたいとしましょう。プログラムからバインダーを使用して対話する必要があります。グーグルで検索しようとしましたが、正確な例が見つかりません。ネイティブ サービスを作成し、それをプログラム内で、必要に応じて Java でも見つける方法を知る必要があります。
3 に答える
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ドメインソケット
Service
Android SDKの通常の機能とAIDL機能を使用して、Javaで実行します。これをネイティブコードと組み合わせたい場合は、JNIを使用してネイティブコードからJavaを呼び出すことができる場合があります。- (非推奨)AndroidOpen-SourceProjectから関連するライブラリとヘッダーをコピーします。NDKプロジェクトに組み込みます。APIを使用します。ただし、これは公式にはサポートされておらず、Googleはそのようなライブラリの互換性を維持する義務を負わないため、将来のリリースでアプリケーションが破損する可能性が非常に高くなります(多くの場合、そうではありません)。クライアントがサービスを見つけられるようにサービスを登録する方法を見つける必要があるため、これも非常に困難です。
私が見つけた解決策は、ネイティブでバインダーを使用し、
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 を勉強してコーディングした後、バインダー API がAndroid NDK で利用できないことがわかりました。また、バインダー API の呼び出しに android オープン ソースを使用している場合でも、バインダーのセキュリティ チェックが原因でアクセス許可が拒否される可能性があります。
ここで、システム サービスにサービスを追加するには、システム レベルのユーザー グループが必要です。詳細コードはhttps://github.com/qianjigui/android_system_service_exampleにあります。C および Java レベルのクライアントとサービスが含まれていますが、システム権限が必要です。