2013-01-08 9 views
8

Il mio compito base è quello di creare un servizio nativo in Android e quindi scrivere un semplice programma nativo per testarlo. Diciamo che voglio scrivere un servizio semplice che mi restituisce la somma di 2 interi. Devo usare i raccoglitori per parlare con esso dal programma, ho provato a google in giro ma non riesco a trovare un esempio preciso. Devo sapere come creare un servizio nativo e trovarlo nel programma e se necessario anche in Java.Come creare un servizio nativo Android e utilizzare il raccoglitore per comunicare con esso?

Per favore aiutatemi. Grazie

risposta

8

La soluzione che ho trovato è quello di utilizzare i Legatoria in nativo e utilizzare il

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

e quindi utilizzare leganti e l'uso seguenti sul lato client.

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

ho trovato esempi qui su come fare questo: https://github.com/gburca/BinderDemo/blob/master/binder.cpp

+0

Non riesco a trovare libbinder.so per il collegamento? Come l'hai risolto? – Jailbroken

+2

@myCodeHurts: libbinder.so è disponibile durante la creazione di AOSP. Non penso che sia disponibile in NDK. – VinayChoudhary99

8

Se si sta creando un'applicazione Android normale utilizzando NDK, non è possibile utilizzare Binder perché non fa parte delle API NDK.

Cerca nei documenti NDK/STABLE-APIS.html per l'elenco completo di API stabili e questo thread per un commento esplicito di David Turner (manutentore NDK) che Binder non è un'API supportata.

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

Le opzioni disponibili sono:

  • Usa qualche altra forma di IPC in codice nativo - per esempio, un socket di dominio UNIX
  • Farlo in Java, utilizzando le normali Service e strutture AIDL dell'SDK di Android. Se desideri combinare questo codice con il codice nativo potresti essere in grado di chiamare a Java dal codice nativo usando JNI.
  • (Non consigliato) Copia le librerie e le intestazioni pertinenti da un progetto Android Open-Source; costruire nel tuo progetto NDK; e utilizzare le API. Tuttavia questo non è ufficialmente supportato ed è estremamente probabile che interrompa la tua applicazione nelle versioni future perché Google non ha l'obbligo di mantenere la compatibilità in tali librerie (e spesso non lo fa). È anche molto difficile, dal momento che è necessario trovare un modo per registrare il servizio in modo che il client possa trovarlo.
3

Dopo aver studiato e codifica @ Android NDK, ho trovato L'API legante è NON disponibile in Android NDK. E anche se si utilizza Android open source per invocare l'API di binder, forse si otterrà l'autorizzazione negata a causa del controllo di sicurezza del raccoglitore.

Qui, se desidero aggiungere un servizio al servizio di sistema, ho bisogno di un gruppo di utenti a livello di sistema. I codici di dettaglio si possono trovare https://github.com/qianjigui/android_system_service_example. Contiene client e servizi di livello C e Java, ma è necessaria l'autorizzazione di sistema.

+0

Per quanto riguarda le autorizzazioni, se la tua versione Android utilizza SELinux, questo potrebbe essere utile: https://source.android.com/security/selinux/implement Ricordati di usare/dev/binder o/dev/vndbinder a seconda della tua versione. –

Problemi correlati