2012-04-28 10 views
5

Devo utilizzare due librerie native: una è la mia e l'altra è di terze parti. Finché li ho usati in progetti separati, tutto andava bene. Ma ora sto ottenendo il Exception Ljava/lang/UnsatisfiedLinkError.librerie native multiple (mia e di terze parti) in Android NDK

Sto usando Eclipse.

Ho scoperto che se inserisco la libreria esistente in libs/armeabi, Eclipse inizia la compilazione del codice nativo e fallisce. Se ricostruisco la parte JNI dalla riga di comando, la compilazione ha esito positivo, ma la libreria di terze parti scompare. Veramente stupido.

Quindi, come faccio a comunicare a Eclipse di utilizzare una libreria .so esistente insieme a una libreria che deve essere costruita? Le librerie sono indipendenti.

risposta

7

L'NDK consente il collegamento con librerie utente predefinite, utilizzando la variabile PREBUILT_SHARED_LIBRARY.

Partendo dal presupposto che la libreria è necessario collegare è librandom.so, creare una cartella in libsjni sottocartella della cartella del progetto:

mkdir -p jni/libs 
cp librandom.so jni/libs 

Poi, basta creare un file jni/libs/Android.mk:

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_MODULE := random 
LOCAL_SRC_FILES := librandom.so 
include $(PREBUILT_SHARED_LIBRARY) 

È possibile creare una sezione per ogni libreria precostruita, il tutto inserito in jni/libs.

Successivamente, devi solo includere il file sopra nel tuo jni/Android.mk per far funzionare le cose. Nella documentazione NDK, si raccomanda che ciò avvenga alla fine del Android.mk, piuttosto che al centro:

include $(LOCAL_PATH)/libs/Android.mk 

Tuttavia, avrete bisogno di fare questo prima che il modulo che richiede questa libreria.

Per il collegamento, è necessario aggiungere quanto segue nella sezione del modulo che collega alla libreria precostruita.

LOCAL_SHARED_LIBRARIES := random 

Poi, quando si fa NDK-build, copierà questa libreria in libs/armeabi/ prima di costruire il modulo, e sei a posto.

Nota: questo non risolve i problemi con le intestazioni richieste. Sarà comunque necessario aggiungere la posizione delle intestazioni per la libreria nella variabile LOCAL_C_INCLUDES nel modulo che lo richiede.

+0

UPDATE: se una libreria dipende da un'altra, consultare http://stackoverflow.com/questions/17688327/android-ndk-make-two-native-shared-libraries-calling-each-other – 18446744073709551615

3

Questo è quello che ho fatto per il momento. Non accetterò (nel senso dello stackoverflow) che la mia (questa) risposta beata sia insoddisfacente.

Ho creato un nuovo progetto e copiato tutti i file java lì. Quindi, ho copiato la libreria .so dal vecchio progetto e la libreria di terze parti in libs/armeabi.

Questo è mostruoso. Ma funziona. Per il momento. La cosa peggiore è che il controllo della versione è silurato.

Problemi correlati