J'ai essayé d'exécuter une application utilisant une bibliothèque native sur le Nexus 9.
L'application se ferme avec un message d'erreur:
Java.lang.UnsatisfiedLinkError: dlopen failed: "lib_xyz.so" is 32-bit instead of 64-bit
Existe-t-il une solution de contournement connue à ce problème (sauf, bien sûr, la recompilation de la bibliothèque et le renforcement de l'apk)?
A trouvé une explication: Android 64 bits peut utiliser les bibliothèques natives 32 bits comme solution de secours, uniquement si System.loadlLibrary () ne trouve rien de mieux dans le chemin de recherche par défaut . Pour charger la bibliothèque 32 bits à l'aide de System.load () avec le chemin d'accès complet à la bibliothèque ..__, la première solution consiste donc à utiliser System.loadLibrary () au lieu de System.load ().
Il faut également prendre en compte le fait que les bibliothèques ne peuvent pas être mélangées: le comportement de repliement s’applique uniquement à la première bibliothèque que votre application charge. Si le premier est 64 bits, aucune bibliothèque 32 bits ne peut être chargée par la même application, et inversement.
le but est de convertir l'environnement d'exécution en 32 bits
ajouter le contenu suivant dans build.gradle
defaultConfig: { ... ndk { abiFilters "armeabi", "armeabi-v7a", "x86", "mips" } }
ajouter Android.useDeprecatedNdk=true
dans gradle.properties
.so
32 bits dans le nouveau dossierhttps://source.Android.com/source/64-bit-builds.html
Essayez ceci dans votre Android.mk
LOCAL_MULTILIB := 32
Non, vous devez obtenir la compatibilité de la bibliothèque native avec 64 bits pour que cela fonctionne.
Voir la documentation officielle: Conseils JNI: Considérations 64 bits
Pour moi, le problème était que j'avais activé la fonctionnalité de profilage avancé dans les paramètres de construction de l'application.
J'ai rencontré le même problème lorsque j'ai fait la mise à jour d'Android Studio 2.1 à 2.2.3 (avec ndk v.13.1) et qu'aucun conseil trouvé dans Google ne m'a vraiment aidé (comme utiliser abiFilters, exclure 'lib/x86_64/lib…. so ', LOCAL_MULTILIB: = 32 ou TARGET_PREFER_32_BIT: = true,…).
Enfin, j'ai réussi à le faire fonctionner à nouveau avec le dernier AS v2.2.3 (sans rien changer dans Android.mk ou dans build.gradle), simplement en utilisant mon précédent compilateur ndk, à savoir Android-ndk-r10e
J'ai construit la bibliothèque manuellement avec ndk-build pour "armeabi-v7a" et "x86" uniquement, et cela a fonctionné comme un charme sur Android avec arm64.