web-dev-qa-db-fra.com

Android NDK Java.lang.UnsatisfiedLinkError: findLibrary a retourné null

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

À l'avant, je dirai que j'ai déjà résolu cela, à ma manière, mais je sens que quelque chose dans le système de construction Android (peut-être concernant Eclipse) est cassé, et j'espère sauver quelqu'un des heures de douleur. 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é à l'aide du NDK. Puis, aujourd'hui, j'ai changé quelque chose dans le Java puis poof, je ne pouvais plus charger ma bibliothèque JNI. Elle a échoué avec une exception comme:

E/AndroidRuntime (999): Java.lang.UnsatisfiedLinkError: impossible de charger mylibrary: findLibrary a retourné null

J'ai googlé et tout essayé (reconstruction, fermeture et relance d'Eclipse, etc, etc.)

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

51
Lee Dixon

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

System.loadLibrary("XYZ");
15
Roy

Si vous essayez d'exécuter votre application dans un simulateur, assurez-vous que vous avez spécifié l'architecture correcte dans Exécuter -> Configurations d'exécution -> Cible (vous devrez peut-être ajouter le simulateur requis à l'aide de Fenêtre -> Android Virtual Device Manager).

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

13
Mike Holenderski

J'ai aussi ce problème, mais pour ma situation, j'utilise mes bibliothèques 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 très bien pour moi, bonne chance :)

  1. doit suivre la règle de nommage de l'interface JNI (vous avez dit que vous aviez chargé la bibliothèque avec succès auparavant, vous pouvez donc l'ignorer) 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, vous devez vous assurer que vos bibliothèques générées sont installées dans votre app.apk, sinon, il ne trouvera toujours pas la bibliothèque et vous signalera une erreur. pour ce faire, faites un clic droit sur le nom de votre projet Eclipse et allez dans Chemin de construction - Configurer le chemin de génération , dans le menu de gauche, choisissez Chemin de génération Java , puis cliquez sur l'onglet Commande et exportation dans le panneau de droite, en cochant la case avant le nom de votre bibliothèque et cliquez sur [~ # ~] ok [ ~ # ~] , puis nettoyez, reconstruisez et exécutez votre projet, et vos bibliothèques seront installées dans app.apk, les choses sont terminées.

enter image description here

enter image description here

enter image description here

MODIFIER:

  1. dans un Word, UnsatisfiedLinkError sont levées si la bibliothèque n'est pas installée dans votre app.apk, donc elle ne peut pas être liée avec succès.
11
BillHoo

Dans le dossier libs, je crée un nouveau dossier appelé armeabi-v7a et copie le fichier .so d'armeabi dans le nouveau dossier. Il résout l'erreur.

6
stevelo

Dans mon cas, lors de la création d'un Application système, le problème était lié aux autorisations. Après avoir placé les fichiers ". So" dans /system/lib/ ou /system/vendor/lib/ répertoire, j'ai modifié les autorisations allouées par défaut 600 à 755. Cela a bien fonctionné.

6
aditya

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


  1. Passer de System.load("hello-test"); à 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 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 classe Java: TestNDK
  • Nom de la source C: 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.

5
Daniel

Tout d'abord, vérifiez que vous avez les fichiers jni dans votre dossier libs dans Eclipse ou le dossier jniLibs dans Android studio. Lorsque vous archivez un fichier svn, vérifiez pour archiver également les fichiers .so.

Mon scénario était lors de la construction avec Android studio.

Lorsque vous créez dans Android studio, vos fichiers .so de bibliothèque ou (jni) doivent se trouver dans le dossier\src\main\jniLibs\armeabi ***. So.

où ces fichiers seront dans le\libs\armeabi ***. donc dans Eclipse.

Lors de la construction à l'aide d'Eclipse et de Android studio, vous devez modifier votre fichier build.gradle comme

main {
            manifest.srcFile 'AndroidManifest.xml'
            Java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']

            // Fixed Issue : "Android studio Java.lang.unsatisfiedlinkerror: couldn't load find library returned null"
            // Cause : For Android studio : The JNI files should be placed in the /src/main/jniLibs folder.
            // Fix : Mapping the jniLibs 's source Directories with Lib's folder
            jniLibs.srcDirs = ['libs']
}

Ici, je construis le projet en utilisant à la fois le Android studio et l'Eclipse.

4
Vishnu Prabhu

Aucune des réponses précédentes n'a résolu mon problème, mais cela s'est produit: Tout au long du problème, il n'y avait pas de sous-répertoire et de fichier nécessaires. Tout ce que j'avais dans mon dossier libs était un dossier armeabi contenant le fichier .so approprié, mais il devrait y en avoir 3 autres, chacun contenant un fichier .so. Je ne sais pas encore lequel des trois autres (armeabi-v7a, mips ou x86) était celui requis, mais je sais que les trois ont été générés automatiquement lorsque j'ai ajouté le fichier Application.mk dans le même dossier que Android.mk et vous êtes assuré qu'il contenait la ligne suivante:

APP_ABI := all

Pour moi, cette ligne est le seul texte là-dedans. Lorsque ndk-build est exécuté, le fichier Application.mk provoque apparemment la création de "tous" les 4 dossiers et la création des fichiers .so appropriés. Une fois Application.mk en place, j'ai de nouveau exécuté ndk-build, puis j'ai effectué un nettoyage et un effacement de mon projet Eclipse avant de réessayer. Tout fonctionnait parfaitement.

2
Alyoshak

juste eu un problème similaire.

Consultez votre répertoire /data/data/your.package.name/lib

Lorsque je suis dans mon répertoire de packages, il affiche actuellement:

lib -> /mismatched_uid/settings_10037/fs_1000

j'ai probablement changé accidentellement le sharedUserId et donc la bibliothèque n'est plus accessible.

2
icyerasor

J'ai ajouté

extern "C"

avant que les fonctions ne déclarent
ex:

extern "C"
jstring
Java_lara_myapplication_MainActivity_stringFromJNI(
            JNIEnv *env,
    jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

alors l'erreur a disparu

1
TheLastSummer

Je venais de le faire et le problème était que le périphérique n'avait tout simplement pas assez d'espace pour installer la bibliothèque. J'ai désinstallé d'autres applications, puis cela a fonctionné.

1
Keith Johnston

Si vous avez un projet natif avec "libXYZ.so", assurez-vous que /system/lib/libXYZ.so n'existe pas sur votre appareil. Il existe une solution douloureuse: utilisez

System.load("/data/data/your.package.name/lib/libXY.so") 

au lieu de System.loadLibrary ().

1
Alex Cohn

Pas besoin de rooter l'appareil .. déployer l'application sur l'émulateur et parcourir le dossier

1
Mayank Mehta

UnsatisfiedLinkerror est résolu par ceci.Construisez à nouveau votre fichier .so par "ndk_build"

0
Udit Kumawat

Eu un problème identique. Projet juste nettoyé et cela a fonctionné. Mystère..

0
Drag0