2013-01-08 25 views
8

私の基本的な仕事は、アンドロイドでネイティブサービスを作成し、それをテストするための簡単なネイティブプログラムを作成することです。私は2つの整数の合計を返す簡単なサービスを書いてほしいと言うことができます。私はプログラムからそれに話すためにバインダーを使用しなければならない、私は周りにGoogleにしようとしたが、私は正確な例を見つけることができません。私は、ネイティブサービスを作成してそれをプログラム内で見つけ、必要に応じてJavaで見つける方法を知る必要があります。アンドロイドネイティブサービスを作成してバインダーを使って通信するにはどうすればいいですか?

私を助けてください。 ありがとう

答えて

8

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

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

+0

リンク用のlibbinder.soは見つかりませんか?どのように解決しましたか? – Jailbroken

+2

@myCodeHurts:libbinder.soはAOSPを構築するときに使用できます。私はNDKで利用できるとは思わない。 – VinayChoudhary99

8

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

安定版APIの完全なリストについては、NDK docs/STABLE-APIS.htmlを参照してください.David Turner(NDK管理者)の明示的なコメントのために、このスレッドはBinderがサポートされていないAPIです。

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

あなたのオプションは以下のとおりです。

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

勉強とAndroid NDK @コーディングした後、私は、バインダーのAPIは、Android NDKでは使用できませんで見つかりました。 バインダーのapiを呼び出すためにアンドロイドオープンソースを使用していても、おそらくの許可が拒否されます。バインダーのセキュリティーチェックのためです。

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

+0

あなたのAndroidバージョンがSELinuxを使用している場合、これは役に立ちます:https://source.android.com/security/selinux/implementあなたのバージョンにもよりますが、/ dev/binderまたは/ dev/vndbinderを使用することを忘れないでください。 –