2015-11-19 12 views
6

Ho sviluppato un'applicazione e una libreria nativa per Android. La libreria nativa utilizza openSL ES per l'elaborazione audio.Collegamento con libreria aggiornata su Android

Nel mio file Android.mk Ho la seguente dichiarazione:

LOCAL_LDLIBS := -lOpenSLES 

Quindi immagino che questo significa che l'applicazione si collegherà in modo dinamico nella biblioteca openSLES dalla cartella di sistema/lib in del dispositivo momento in cui l'applicazione viene caricata/eseguita sul dispositivo?

Il problema che sto affrontando è che le librerie sul dispositivo sono buggate e ho 3 librerie aggiornate che contengono la correzione del bug. Se possibile, come faccio a fare in modo che la mia libreria nativa sta usando le 3 librerie che ho:

Libwilhelm.so 
libOpenMAXAL.so 
libOpenSLES.so 

Posso solo sostituire

LOCAL_LDLIBS := -lOpenSLES 

con

LOCAL_SHARED_LIBRARIES := -lOpenSLES -lOpenMAXAL -lwilhelm 

risposta

4

Finché target di un dispositivo specifico o di un set di dispositivi molto limitato, la soluzione proposta è abbastanza buona. Ma se il tuo obiettivo è un'app pubblica, che verrà installata su piattaforme diverse, inclusa la futura versione "N" di Android e ROM personalizzate, tra cui ad es. Samsung, si dovrebbe fare attenzione con le dipendenze del sistema di queste librerie.

Mentre OpenSLES e OpenMAXAL sono innocenti (dipendono solo da liblog e libwilhelm), quest'ultimo richiede più attenzione.

Guardando la sua Android.mk, libwilhelm dipende liblog libutils libmedia libbinder libstagefright libstagefright_foundation libcutils libgui libdl libeffects e libstagefright_http_support.

Solo liblog e libdl sono "ufficiale" (vale a dire, parte della NDK). Gli altri dipendono dalla piattaforma e le loro funzioni esportate potrebbero non essere compatibili con dispositivi diversi che eseguono lo stesso livello di piattaforma.

Per motivi di sicurezza, vorrei solo introdurre le correzioni e continuare a utilizzare la versione di sistema di libwilhelm quando possibile. Spero che tu possa ridurre le dipendenze del sistema in questo modo.

+0

Quindi, in che modo posso accertarmi che la mia app stia utilizzando la mia versione di libOpenSLES.so invece della versione buggy in system/libs? In particolare, come dovrebbe apparire il mio file Android.mk? – user1884325

+0

Sì, se lo specifichi in LOCAL_SHARED_LIBRARIES verrà installato sul dispositivo con il tuo APK. Nelle ultime versioni di Android, verrà caricato automaticamente. Nelle versioni precedenti, il caricatore può preferire caricare librerie libs dalla directory di sistema, quindi è possibile utilizzare esplicitamente System.loadLibrary() o dlopen(). –

+0

Quando dici più vecchio parliamo di pre-4.4.2? E con "caricato automaticamente" intendi che la mia libreria condivisa locale verrà caricata automaticamente? Come posso verificare dove viene effettivamente caricata la lib da quando l'applicazione viene avviata su un dispositivo? – user1884325

Problemi correlati