53 votes

Android NDK java.lang.UnsatisfiedLinkError : findLibrary retourné null

Vous rencontrez l'erreur ci-dessus dans votre application Android JNI ? Lisez la suite...

Je dirai d'emblée que j'ai déjà résolu ce problème, à ma façon, mais je pense que quelque chose dans le système de construction d'Android (peut-être en ce qui concerne Eclipse) est cassé, et j'espère épargner à quelqu'un d'autre des heures de souffrance. Peut-être que d'autres ont rencontré ce problème et peuvent commenter ce qui a fonctionné pour eux.

Pendant un certain temps, j'ai eu un projet Android avec du code JNI que j'ai développé en utilisant le NDK. Aujourd'hui, j'ai modifié quelque chose dans le code java et pouf, je ne pouvais plus charger ma bibliothèque JNI. Il a échoué avec une exception du genre :

E/AndroidRuntime( 999) : java.lang.UnsatisfiedLinkError : Couldn't load mylibrary : findLibrary returned null (impossible de charger ma bibliothèque)

J'ai cherché sur Internet et j'ai tout essayé (reconstruire, fermer et relancer Eclipse, etc, etc).

Qu'est-ce qui a finalement résolu mon problème ? J'ai physiquement désinstallé mon application de l'appareil avant d'essayer une autre exécution. Et c'est tout. Après ça, ça a marché. Qu'est-ce qui a marché pour vous ?

0 votes

J'ai vu un comportement étrange où j'ai dû copier le fichier .so hors de l'arborescence de l'ordinateur. \LIBS\ARMEABI et le placer dans le répertoire \LIBS pour qu'il le trouve.

1 votes

J'ai le même problème avec mon application, malheureusement certains de mes clients reçoivent ce problème (je vois beaucoup de rapports de crash pour cela). Je ne sais pas pourquoi cela ne se produit que sur "certains", mais cela fonctionne sur la plupart. Je n'ai jamais été capable de le reproduire moi-même. Très étrange...

0 votes

J'avais deux instances de mon application sur le dispositif, ayant juste ajouté un sharedUserId au manifeste, et j'ai oublié de désinstaller l'ancienne version d'abord. Merci pour le rappel !

15voto

user2405839 Points 147

Si vous avez un projet natif avec LOCAL_MODULE "libXYZ", assurez-vous de le charger en tant que

System.loadLibrary("XYZ");

0 votes

Cela a fonctionné pour la première partie de l'erreur, je reçois maintenant java.lang.UnsatisfiedLinkError : method_name_here

1 votes

C'est une incroyable merde de google ! Ça m'a coûté 2 heures. J'ai hâte de développer à nouveau pour Windows Mobile.

13voto

Mike Holenderski Points 111

Si vous essayez d'exécuter votre application dans un simulateur, assurez-vous d'avoir spécifié la bonne architecture dans Exécuter -> Configurations d'exécution -> Cible (vous devrez peut-être ajouter le simulateur requis en utilisant Fenêtre -> Gestionnaire de périphériques virtuels Android).

J'ai eu le même problème en essayant d'exécuter une application dans un simulateur Intel, alors que l'application utilisait une bibliothèque précompilée pour l'ARM.

11voto

BillHoo Points 475

J'ai aussi ce problème, mais dans ma situation, j'utilise mes librairies dans un autre projet. Et je ne pense pas que ce soit une question d'eclipse ou d'Android-ndk.

vous pouvez vérifier ces conseils qui peuvent conduire à UnsatisfiedLinkError et cela fonctionne bien pour moi, bonne chance :)

  1. doivent suivre la règle de dénomination de l'interface JNI (vous avez dit que vous aviez chargé la bibliothèque avec succès auparavant, vous pouvez donc ignorer cela) et les bibliothèques doivent se trouver dans le répertoire /your project/libs/armeabi/
  2. si vous vous assurez que les choses ci-dessus sont faites, alors vous devez vous assurer que vos libs générées sont installé dans votre app.apk, sinon il ne trouvera toujours pas la librairie et vous enverra une erreur. Pour ce faire, vous devez faire un clic droit sur le nom de votre projet eclipse, et aller dans Chemin de construction - Configurer le chemin de construction Dans le menu de gauche, choisissez Chemin de construction de Java puis cliquez sur le bouton Commande et exportation dans le panneau de droite, en cochant la case précédant le nom de votre bibliothèque et cliquez sur OK Ensuite, nettoyez, reconstruisez et exécutez votre projet, et vos librairies seront installées dans app.apk, les choses sont faites.

enter image description here

enter image description here

enter image description here

EDIT :

  1. en un mot, UnsatisfiedLinkError sont lancés si la bibliothèque n'est pas installée dans votre app.apk, et qu'elle ne peut donc pas être liée avec succès.

6voto

user1647750 Points 41

Dans le dossier libs, j'ai créé un nouveau dossier appelé armeabi-v7a, et j'ai copié le fichier .so d'armeabi dans ce nouveau dossier. Cela résout l'erreur.

5voto

Daniel Points 32

J'avais le même problème et voici quelques-uns des problèmes que j'ai rencontrés dans mon projet :


  1. Passer de System.load("hello-test"); en System.loadLibrary("hello-test"); ;
  2. Changer la signature de la fonction C en JNIEXPORT jstring Java_com_example_testndk_TestNDK_funcNami(JNIEnv* env, jobject thiz) : ici vous utilisez Java_<java_package_name>_<java-class-name>_<function-name> ;
  3. Ajout du chemin du NDK à local.properties dans mon cas ndk.dir=<my-path-to-ndk-directory> ; et
  4. Mise à jour de mon build.gradle à inclure également dans defaultConfig : ndk { moduleName "hello-test" } .

  • Nom du paquet : com.example.testndk
  • Nom de la classe Java : TestNDK
  • C le nom de la source : hello-test.c
  • Emplacement du répertoire JNI dans la structure du projet : AndroidProjects/TestNDK/app/src/main/jni

IDE : Android Studio 0.8.1.

0 votes

System.load() est utilisé lorsque vous voulez spécifier le chemin d'accès et le nom du fichier, normalement on utilise System.loadLibrary() avec le nom court de la bibliothèque (pas de chemin d'accès, et sans le préfixe "lib" ou le suffixe ".so").

2 votes

Pour moi, le point 4 (inclure "ndk" dans defaultConfig) a fait l'affaire. Merci !

0 votes

Merci pour le defaultConfig dans gradle. Je n'ai pas réussi à repérer mon erreur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X