2011-01-18 12 views
14

Sto scrivendo un progetto Android che ha il livello Nativo che aiuta il livello java, e sono bloccato in un punto in cui prova a fare un System.loadLibrary, lancia un errore che non è in grado di collegarlo.Impossibile eseguire il dlopen (libsomething.so) Impossibile caricare la libreria: link_image [1995]: impossibile collegare libsomething.so

Sto utilizzando NDK specifico di destinazione per creare il livello nativo e quindi utilizzare formica per compilare e creare l'apk.

Durante l'esecuzione sul dispositivo ottengo il seguente errore.

Impossibile dlopen (libsomething.so) Impossibile caricare la libreria: link_image [1995]: non è riuscito a collegare libsomething.so

La biblioteca ottenere in bundle nella apk, e viene decompresso correttamente. Se provo a rimuovere la libreria manualmente e poi a eseguirla, essa effettivamente getta quella libreria non trovata. Quindi è in grado di trovare la libreria, ma genera questo errore e non sono in grado di scoprire perché questo errore sta arrivando.

Per favore aiutatemi.

risposta

10

Individuare innanzitutto la posizione del file .so. e quindi può provare:

seguente si presuppone la posizione della libreria condivisa come: /data/data/my.package/lib/libmysharedlibrary.so

try { 
    //System.loadLibrary("mysharedlibrary"); 
    System.load("/data/data/my.package/lib/libmysharedlibrary.so"); 
} catch (UnsatisfiedLinkError use) { 
    Log.e("JNI", "WARNING: Could not load libmysharedlibrary.so"); 
} 
+0

Come ho già detto, la libreria è presente nella posizione richiesta. Ricevo un output di log che dice che sta cercando di caricare la libreria, ma al momento sto provando a caricare, mi dà quell'errore. Tuttavia, proveremo anche questo cambiamento .. Stranamente, questo stesso apk funziona su un dispositivo, ma non sull'altro. E ho totalmente confuso sul motivo per cui questo comportamento sta accadendo. – Puneet

+0

È possibile aggiornare il percorso del file della libreria su entrambi i dispositivi? – TheCottonSilk

+0

È pacchettizzato in apk, quindi viene decompresso automaticamente durante l'installazione, nella stessa directory. i.e /data/data/package/lib/libsomething.so – Puneet

3

Questo errore si riscontra anche durante l'utilizzo del metodo System.load (String pathName) e del passaggio di libreriaName invece del percorso completo alla libreria.

Risoluzione: utilizzare il metodo System.loadLibrary (String libName) e ora passare il nome della libreria.

3

A volte (la maggior parte delle volte!) La libreria richiede altre librerie come menzionato da @musefan. e puoi elencarli facendo read -d libs/armeabi/libmy.so. Comunque qui c'è un problema: dato che Android non ha alcun meccanismo per controllare la versione della libreria (come nel normale linux hai liblzma.so.1, liblzma.so.2, ecc.) La libreria di cui hai bisogno è lì (liblzma.so) MA non ha alcuni simboli importati dalla tua libreria. Ecco l'esempio dal vivo: si utilizza la funzione android::ZipFileRO::getEntryInfo situata in libutils.so. Tutte le versioni della libreria hanno questa funzione, tuttavia il PROTOTIPO della funzione è stato modificato alla fine del 2010, quindi l'applicazione creata per 4.0.4 NDK non verrà eseguita sui dispositivi FroYo o sui dispositivi GB con lo stesso sintomo: dlopen Impossibile caricare la libreria. Ecco la ricetta su come rilevare questi casi: hai bisogno del contenuto della cartella os/system/lib sul tuo PC. Potrebbe essere una cartella scaricata dal tuo dispositivo se sei un'app di terze parti sviluppata o costruita se sei uno sviluppatore di piattaforme.quindi eseguire il comando arm-linux-gnueabi-ld -rpath-link /path/to/system/lib ./lib_mylib.so e vedrete qualcosa di menzogna questo in caso di errore
lib_mylib.so: undefined reference to Android :: :: ZipFileRO getEntryInfo (void *, int *, lungo *, lungo *, lungo *, lungo *, lungo *) const'`

Problemi correlati