web-dev-qa-db-fra.com

Comment utiliser les bibliothèques natives 32 bits sur un périphérique 64 bits Android

J'utilise une bibliothèque native dans mon application qui est uniquement compilée pour armeabi, armeabi-v7a et x86.

Lorsque cette bibliothèque est chargée sur un périphérique 64 bits tel que le Samsung S6, l'application se bloque avec une erreur 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 bibliothèque est source fermée malheureusement. Existe-t-il un moyen de résoudre ce problème sans recompiler la bibliothèque avec des cibles 64 bits?

53
Philipp E.

Lorsque vous installez un APK sur Android, le système recherche les répertoires des bibliothèques natives (armeabi, armeabi-v7a, arm64-v8a, x86, x86_64, mips64, mips) dans le dossier lib de l'APK, dans le répertoire ordre déterminé par Build.SUPPORTED_ABIS.

Si votre application possède un arm64-v8a répertoire avec les bibliothèques manquantes, les bibliothèques manquantes ne seront pas installées à partir d’un autre répertoire, les bibliothèques ne sont pas mélangées. Cela signifie que vous devez fournir l’ensemble complet de vos bibliothèques pour chaque architecture.

Donc, pour résoudre votre problème, vous pouvez supprimer vos bibliothèques 64 bits de votre construction ou définir abiFilters pour qu'il ne regroupe que les architectures 32 bits:

Android {
    ....
    defaultConfig {
        ....
        ndk {
            abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
        }
    }
}
130
ph0b