2015-06-11 9 views
43

Ich verwende eine native Bibliothek in meiner Anwendung, die nur für armeabi, armeabi-v7a und x86 kompiliert wird.So verwenden Sie 32-Bit-native Bibliotheken auf 64-Bit-Android-Geräten

Wenn diese Bibliothek auf einem 64-Bit-Gerät wie die Samsung S6 die Anwendung abstürzt mit einer 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) 

Der Bibliothek ist leider geschlossene Quelle geladen wird. Gibt es eine Möglichkeit, das zu beheben, ohne die Bibliothek mit 64-Bitzielen neu zu kompilieren?

+0

Haben Sie unter https sah: // Stackoverflow. com/q/27712921/603270 und https://Stackoverflow.com/a/29329413/603270? – shkschneider

+0

Ich habe. Einer gilt für AOSP, der andere für dynamisches Classloading. Mein Fall ist eigentlich viel einfacher. Aber ich habe gerade entdeckt, dass eine andere native Bibliothek, die ich einschließe, tatsächlich 64-bit .so-Dateien liefert, daher gibt es einen arm64-86-Ordner in meinem/lib-Ordner in der endgültigen apk. Wahrscheinlich geht das System daher davon aus, dass ich in allen Fällen 64-Bit-.so-Dateien zur Verfügung stelle. Ich werde versuchen, diese Bibliothek mit 32-Bit-Unterstützung nur neu zu kompilieren und sehen, ob es funktioniert. –

+0

Gutes Denken. Lassen Sie es uns wissen (beantworten Sie Ihre eigene Frage, falls nötig). – shkschneider

Antwort

109

Wenn Sie eine APK auf Android installieren, das System für die nativen Bibliotheken Verzeichnisse aussieht (armeabi, armeabi-V7A, arm64-V8A, x86, x86_64, MIPS64, Mips) innerhalb des lib Ordners des APK, in der Reihenfolge bestimmt durch Build.SUPPORTED_ABIS.

Wenn Ihre App ein Verzeichnis arm64-v8a mit fehlenden Bibliotheken hat, werden die fehlenden Bibliotheken nicht aus einem anderen Verzeichnis installiert, die Bibliotheken sind nicht gemischt. Das bedeutet, dass Sie für jede Architektur den vollständigen Satz Ihrer Bibliotheken bereitstellen müssen.

Also, Ihr Problem zu lösen, können Sie Ihre 64-Bit-Bibliotheken von Build, oder setzen Sie abiFilters entfernen nur 32-Bit-Architekturen zu verpacken:

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

Sieht gut aus, die 64-Bit-Ordner sind mit diesem Snippet weg. Ich werde die Antwort als akzeptiert markieren, sobald ich ein 64-Bit-Telefon finden kann, um zu reproduzieren –

+0

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

+0

Fehler erhalten Die NDK-Integration ist im aktuellen Plugin veraltet. Überlege dir, ob du das neue experimentelle Plugin ausprobieren möchtest. –