web-dev-qa-db-fra.com

Utiliser des bibliothèques jni 32 bits sur Android 64 bits

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)?

17
G B

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.

26
G B

le but est de convertir l'environnement d'exécution en 32 bits

  1. ajouter le contenu suivant dans build.gradle

    defaultConfig: { ... ndk { abiFilters "armeabi", "armeabi-v7a", "x86", "mips" } } 

  2. ajouter Android.useDeprecatedNdk=true dans gradle.properties  

  3. ajoutez un nouveau dossier nommé armeabi sous les bibliothèques, puis copiez un fichier .so 32 bits dans le nouveau dossier
10
vincent.song

https://source.Android.com/source/64-bit-builds.html

Essayez ceci dans votre Android.mk

LOCAL_MULTILIB := 32
1
AudiO

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

0
shkschneider

Pour moi, le problème était que j'avais activé la fonctionnalité de profilage avancé dans les paramètres de construction de l'application.

0
Giacomo Locci

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.

0
fjnet