2013-01-08 2 views
8

Meine grundlegende Aufgabe ist es, einen nativen Dienst in Android zu erstellen und dann ein einfaches natives Programm zu schreiben, um es zu testen. Nehmen wir an, ich möchte einen einfachen Dienst schreiben, der mir eine Summe von 2 ganzen Zahlen zurückgibt. Ich muss Binder benutzen, um mit ihm vom Programm zu sprechen, ich habe versucht, herum zu googeln, aber ich kann ein genaues Beispiel nicht finden. Ich muss wissen, wie man einen nativen Service erstellt und ihn im Programm und bei Bedarf auch in Java findet.Wie erstellt man einen android nativen Dienst und verwenden Sie Bindemittel, um damit zu kommunizieren?

Bitte helfen Sie mir. Danke

Antwort

8

Die Lösung, die ich gefunden ist, die Bindemittel in nativer zu verwenden und die auf Client-Seite folgende

defaultServiceManager()->addService(
     String16("TestService"),new CalcService()); 

und dann mit Bindemitteln und Gebrauch.

sp<IServiceManager> sm = defaultServiceManager(); 
sp<IBinder> binder = sm->getService(String16("TestService")); 

fand ich Beispiele hier auf, wie dies zu tun: https://github.com/gburca/BinderDemo/blob/master/binder.cpp

+0

Ich kann libbinder.so zum Verlinken nicht finden? Wie hast du das gelöst? – Jailbroken

+2

@myCodeHurts: Der libbinder.so ist beim Erstellen von AOSP verfügbar. Ich denke nicht, dass es in NDK verfügbar ist. – VinayChoudhary99

8

Wenn Sie eine normale Android-Anwendung mit dem NDK erstellen, können Sie Binder nicht verwenden, da es nicht Teil der NDK-APIs ist.

Suchen Sie in der NDK-Dokumentation/STABLE-APIS.html nach der vollständigen Liste der stabilen APIs und diesem Thread für einen expliziten Kommentar von David Turner (dem NDK-Betreuer), dass Binder keine unterstützte API ist.

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

Optionen sind verfügbar:

  • Verwenden einer andere Form der IPC in nativen Code - zum Beispiel einer UNIX-Domain-Socket
  • Sie es in Java, mit den normalen Service und AIDL Einrichtungen des Android SDK. Wenn Sie dies mit nativem Code kombinieren möchten, können Sie Java möglicherweise mithilfe von JNI aus nativem Code aufrufen.
  • (nicht empfohlen) Kopieren Sie die relevanten Bibliotheken und Header aus einem Android Open-Source-Projekt; bauen Sie in Ihr NDK-Projekt ein; und verwende die APIs. Dies wird jedoch nicht offiziell unterstützt und wird Ihre Anwendung in zukünftigen Versionen höchstwahrscheinlich beschädigen, da Google nicht verpflichtet ist, die Kompatibilität in solchen Bibliotheken aufrechtzuerhalten (und häufig nicht). Es ist auch sehr schwierig, da Sie eine Möglichkeit finden müssen, den Dienst so zu registrieren, dass der Client ihn finden kann.
3

Nach dem Studium und Codierung @ Android NDK, fand ich das Bindemittel API in Android NDK NICHT verfügbar ist. Und auch wenn Sie Android Open Source für den Aufruf der Bindemittel API verwenden, erhalten Sie möglicherweise Berechtigung verweigert wegen der Binder Sicherheitsprüfung.

Hier, wenn ich einen Dienst zum Systemdienst hinzufügen möchte, brauche ich eine Benutzergruppe auf Systemebene. Die Detailcodes finden Sie unter https://github.com/qianjigui/android_system_service_example. Es enthält den Client und den Dienst der C- und Java-Ebene, Sie benötigen jedoch die Systemberechtigung.

+0

In Bezug auf Berechtigungen, wenn Ihre Android-Version SELinux verwendet, könnte dies hilfreich sein: https://source.android.com/security/selinux/implement Denken Sie daran,/dev/binder oder/dev/vndbinder abhängig von Ihrer Version zu verwenden. –

Verwandte Themen