2013-04-22 13 views
9

Ho un progetto Android con una struttura di cartelle libs come questa:Perché non è libgnustl_shared.so essere copiato dal mio APK?

/libs 
    /armeabi 
    libfoo.so 
    libbar.so 
    libmystuff.so 
    libgnustl_shared.so 
    /armeabi-v7a 
    libfoo.so 
    libbar.so 

foo e bar sono librerie di terze parti, mystuff è la mia libreria da un progetto separato Android JNI che richiede gnustl_shared, che è della stessa Progetto JNI.

Quando costruisco il mio progetto in Eclipse, posso visualizzare il contenuto dell'APK generato utilizzando unzip -l e in effetti mostra che tutti questi file di libreria sono stati inclusi.

Tuttavia, dopo aver installato l'APK, la cartella /data/data/com.myproject/lib non contiene libgnustl_shared.so, anche se sono presenti le altre librerie.

Questo porta inevitabilmente alla seguente errore:

UnsatisfiedLinkError: Couldn't load gnustl_shared: findLibrary returned null 

Come un controllo di integrità, mi sono imbattuto adb push ./libs/armeabi/libgnustl_shared.so /data/data/com.myproject/lib e abbastanza sicuro, l'applicazione si avvia come previsto.

Non vedo nulla nel log di compilazione o nella console di Eclipse che suggerisce l'esistenza di problemi nella creazione o nell'installazione dell'app.

  • Cosa potrebbe impedire di installare libgnustl_shared.so con la mia applicazione?
  • Dove posso andare per sapere cosa succede quando un APK è installato?

Fatemelo sapere in un commento se ci sono informazioni specifiche posso fornire che potrebbe aiutare.

+0

doppio controllare la Mainfest per le dichiarazioni, tra cui tutte le librerie. –

+0

@RobertRowntree - Potresti spiegare cosa intendi? Non ho mai avuto bisogno di specificare le librerie in 'AndroidManifest.xml' per altri progetti, se è quello a cui ti stai riferendo. – namuol

+0

leggi qui: http://developer.android.com/tools/projects/projects-cmdline.html#ReferencingLibraryProject –

risposta

0

Credo che la vostra libgnustl_shared.so necessità sotto /armeabi-V7A non sotto /armeabi

Prova copiare libgnustl_shared.so-/armeabi-V7A

+0

Ho provato anche questo, per avvalermi. – namuol

+0

Salve @namuol; se non è stato trovato * libgnustl_shared.so * in '/ data/data/com.myproject/lib' significa che questa lib non sarà impacchettata nel tuo APK. – caopeng

+0

@namuol è il tuo app 'APP_ABI' in' Application.mk'? Di default, 'APP_ABI' è uguale a ** armeabi **, – caopeng

0

sguardo alla risposta qui: How to link any library in ndk application Il problema è molto probabile nel tuo file Android.mk. Si dovrebbe avere una linea simile a quella in basso:

include $(BUILD_SHARED_LIBRARY) 

Se no, allora non stai compreso il vostro libreria condivisa.

+0

Sto usando questa linea esatta nel progetto JNI dove ho trovato 'libmystuff.so' e' libgnu_stl_shared.so'; il progetto a cui mi riferisco nella mia domanda non è un progetto JNI, quindi non è necessario il file 'Android.mk'. – namuol

2

penso che, nel file di Android.mk del progetto JNI, molto probabilmente, quando si costruisce libmystuff.so, stai riferimento libgnustl_shared.so come:

LOCAL_LDLIBS += -lgnustl_shared 

Forse si può provare ad aggiungerlo come modulo (NDK funziona davvero concentrato sui moduli), qualcosa come:

include $(CLEAR_VARS) 
LOCAL_MODULE := gnustl_shared 
LOCAL_SRC_FILES := libgnustl_shared.so 
include $(PREBUILT_SHARED_LIBRARY) 

e (nella sezione si sta costruendo libmystuff.così):

LOCAL_SHARED_LIBRARIES := gnustl_shared 

e verificare se è finalmente copiato

+0

Grazie. Mi mancava la riga 'LOCAL_SHARED_LIBRARIES: = gnustl_shared'. – Martin

Problemi correlati