2015-06-11 15 views
43

Uso nella mia applicazione una libreria nativa compilata solo per armeabi, armeabi-v7a e x86.Come utilizzare le librerie native a 32 bit su dispositivi Android a 64 bit

Quando questa libreria viene caricata su un dispositivo a 64 bit come il Samsung S6, l'applicazione si blocca con un UnsatisfiedLinkError

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.myapp-2/base.apk"],nativeLibraryDirectories=[/data/app/com.myapp-2/lib/arm64, /vendor/lib64, /system/lib64]]] couldn't find "libfoo.so" 
    at java.lang.Runtime.loadLibrary(Runtime.java:366) 
    at java.lang.System.loadLibrary(System.java:989) 

La libreria è closed source purtroppo. C'è un modo per risolvere questo problema senza ricompilare la libreria con target a 64 bit?

+0

Hai guardato https: // StackOverflow. it/q/27712921/603270 e https://stackoverflow.com/a/29329413/603270? – shkschneider

+0

L'ho fatto. Uno vale per AOSP, l'altro per il caricamento dinamico della classe. Il mio caso è in realtà molto più semplice. Ma ho appena scoperto che un'altra libreria nativa che includo effettivamente fornisce i file .so a 64 bit, quindi c'è una cartella arm64-86 nella mia cartella/lib nell'apk finale. Probabilmente questo è il motivo per cui il sistema presuppone che fornisco i file .so a 64 bit in tutti i casi. Proverò a ricompilare questa libreria con il solo supporto a 32 bit e vedere se funziona. –

+0

Buon pensiero. Fateci sapere (rispondete alla vostra stessa domanda se necessario). – shkschneider

risposta

109

Quando si installa un APK su Android, il sistema cercherà le directory delle librerie native (armeabi, armeabi-v7a, arm64-v8a, x86, x86_64, mips64, mips) all'interno della cartella lib dell'APK, nell'ordine determinato da Build.SUPPORTED_ABIS.

Se la tua app ha una directory arm64-v8a con librerie mancanti, le librerie mancanti non verranno installate da un'altra directory, le librerie non sono miste. Ciò significa che devi fornire il set completo delle tue librerie per ogni architettura.

Così, per risolvere il problema, è possibile rimuovere le librerie a 64 bit dal vostro costruire, o impostare abiFilters per confezionare solo architetture a 32 bit:

android { 
    .... 
    defaultConfig { 
     .... 
     ndk { 
      abiFilters "armeabi", "armeabi-v7a", "x86", "mips" 
     } 
    } 
} 
+1

Sembra buono, le cartelle a 64 bit sono sparite con questo snippet. Contrassegnerò la risposta come accettata quando riesco a trovare un telefono a 64 bit per riprodurre –

+0

http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits#TOC-ABIs- Divisioni –

+0

Errore durante l'integrazione NDK è deprecato nel plug-in corrente. Prova a provare il nuovo plug-in sperimentale. –