Ich habe eine App mit 2 nativen Bibliotheken. 1. funktioniert viel schneller auf ARMv7, so habe ich Version für ARMv7 und ARMv5. 2. funktioniert auf beiden Plattformen gleich, daher wird nur die ARMv5-Bibliothek bereitgestellt.Android L Preview sucht nicht nach nativen Bibliotheken im "armeabi" -Ordner (UnatisfiedLinkError)
Meine Mutter Library-Ordner wie folgt aussieht:
/jniLibs/
|
+---armeabi/
| |
| +---libFirstLibrary.so
| +---libSecondLibrary.so
|
+---armeabi-v7a/
|
+---libFirstLibrary.so
Die App funktioniert gut auf allen Geräten und Android-Versionen in der Produktion.
Wenn ich es auf meinem Nexus 5 mit L-Vorschau getestet (Hammerhai-lpv79-Vorschau-ac1d8a8e.tgz), bekomme ich diesen Fehler:
java.lang.UnsatisfiedLinkError: Couldn't load SecondLibrary from loader dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.package-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.package-1, /vendor/lib, /system/lib]]]: findLibrary returned null
at java.lang.Runtime.loadLibrary(Runtime.java:358)
at java.lang.System.loadLibrary(System.java:610)
Das Problem ist, dass trotz der Tatsache, Nexus 5 hat CPU_ABI
eingestellt auf armeabi-v7a
und CPU_ABI2
eingestellt auf armeabi
, verwendet L-Preview nur CPU_ABI
value und sucht nach "SecondLibrary" nur im "armeabi-v7a" -Ordner und stürzt ab, da es nicht da ist.
Wenn ich die .so-Datei auch in den Ordner "armeabi-v7a" kopiere, ist alles in Ordnung, aber die APK ist 3,5 MB größer, was ich nicht wirklich mag.
Ist es nur ein Fehler von Android L-Preview oder ein "neues Feature"?
Im Allgemeinen ja, aber fast alle Geräte haben Unterstützung für zwei ABIs. In meinem Fall unterstützt Nexus 5: 'CPU_ABI = armeabi-v7a' und' CPU_ABI2 = armeabi'. Der gleiche Mechanismus wird verwendet, d. H. Für Intel-Geräte, wo primäre ABI 'x86' ist, aber sekundär 'armeabi' ist, so dass meine App auch auf Intel-Geräten gut läuft, obwohl keine native Bibliothek in' x86'-Ordner vorhanden ist. Meiner Meinung nach gibt es keinen Grund, warum das nicht auch bei L-Preview funktionieren sollte. – xsveda
Ja, aber der Paketmanager sucht nur nach Bibliotheken im sekundären ABI-Verzeichnis, wenn keine im primären ABI-Verzeichnis gefunden wurden. Die Dokumentation, die ich verlinkte, sagt: "Der Paket-Manager-Service wird die .apk scannen und nach einer freigegebenen Bibliothek des Formulars suchen: lib//lib .so Wenn [...] gefunden wird, wird es unter' kopiert $ APPDIR/lib/lib .so' Wenn keiner gefunden wird und ein sekundärer ABI definiert ist, sucht der Service nach freigegebenen Bibliotheken des Forms: lib//lib . damit". Wenn also das primäre ABI-Verzeichnis nicht leer ist, wird das sekundäre ABI-Verzeichnis nicht überprüft. –
mstorsjo
Das ist also, was ich in meiner ursprünglichen Antwort gemeint habe - es extrahiert immer nur ein einziges Architekturverzeichnis - das kann entweder der primäre oder der sekundäre ABI sein. – mstorsjo