2013-03-03 10 views
6

Sono presenti due librerie native di terze parti, ad esempio libfoo.so e libbar.so. Sto avendo difficoltà a caricare entrambe queste librerie. Li ho copiati nella cartella libs sotto il corretto arco della CPU (armeabi, mips e x86) e impostato la directory Native libs sotto Struttura del progetto> Moduli> Android> Struttura per puntare a questa cartella di libs. Posso caricare solo una libreria ma non l'altra. Se provo a caricarli uno alla volta (eliminando le altre librerie), funziona bene. L'eccezione che sto ricevendo è:Come aggiungere più file nativi di librerie (.so) in IntelliJ

java.lang.UnsatisfiedLinkError: Couldn't load foo from loader dalvik.system.PathClassLoader 

Cosa devo fare per avere IntelliJ o runtime di Android per trovare entrambe queste librerie native?

+2

Come li hai caricati? – bricklore

+0

Hai guardato nel file .APK risultante per vedere cosa viene inserito lì? È solo un file zip: aprilo con 7-Zip o con qualsiasi altro gestore di file zip e dovresti vedere tutti i file .so lì. – SomeCallMeTim

+0

@SomeCallMeTime: Grazie amico per avermi insegnato come fare riferimento alle librerie all'interno di un apk. Ho riscontrato un problema con java.lang.UnsatisfiedLinkError: non è stata trovata alcuna implementazione per la mappa autonavi di androidNewInstance. Sto aggiungendo due librerie jni di terze parti nel mio codice. e ho scoperto che una lib supporta più architetture cpu e una supporta solo armeabi, quindi ho rimosso le altre architetture da quella che supporta più CPU e metto solo i file armeabi nel mio progetto e ora funziona bene –

risposta

0

È completamente trovare caricare più librerie native. Basta copiarli nella directory/libs/CPU_ARCH /. Tuttavia tutte le librerie devono essere della stessa architettura. Se diciamo che libfoo.so è armeabi ma libbar.so è x86 allora ne verrà copiato solo uno (come nel mio trial qualche tempo fa).

Quindi è possibile caricarlo:

static { 
    //the following 3 are identical 
    //System.load(context.getApplicationInfo().dataDir + "/lib/libfoo.so"); 
    //Runtime.getRuntime().load(context.getApplicationInfo().dataDir + "/lib/libfoo.so"); 
    System.loadLibrary("foo"); 

    System.loadLibrary("bar"); 
} 

Se System.loadLibrary() fallisce, allora si può provare di carico con il percorso completo utilizzando System.load() o Runtime.getRuntime load()()

.
Problemi correlati