Android NDK java.lang.UnsatisfiedLinkError: findLibrary вернул ноль

Имеете вышеуказанную ошибку в вашем приложении JNI для Android? Читать дальше...

Вначале я скажу, что я уже решил это по-своему, но я чувствую, что что-то в системе сборки Android (возможно, в отношении Eclipse) сломалось, и я надеюсь сэкономить кому-то еще несколько часов боли. Возможно, другие сталкивались с этой проблемой и могут прокомментировать, что сработало для них.

Некоторое время у меня был проект Android с некоторым JNI-кодом, который я разработал с использованием NDK. Затем, сегодня я что-то изменил в коде java, а затем poof, я больше не мог загружать свою библиотеку JNI. Это не удалось с исключением как:

E / AndroidRuntime (999): java.lang.UnsatisfiedLinkError: Не удалось загрузить mylibrary: findLibrary вернул ноль

Я гуглил и пробовал все (пересборка, закрытие и перезапуск Eclipse и т. Д. И т. Д.)

Что в итоге решило мою проблему? Я физически удалил свое приложение с устройства перед тем, как повторить попытку. Вот и все. После этого все заработало. Что сработало для вас?

17 ответов

Если у вас есть собственный проект с LOCAL_MODULE "libXYZ", обязательно загрузите его как

System.loadLibrary("XYZ");

Если вы пытаетесь запустить свое приложение в симуляторе, убедитесь, что вы указали правильную архитектуру в "Выполнить" -> "Конфигурации запуска" -> "Цель" (вам может потребоваться добавить требуемый симулятор с помощью "Окно" -> "Диспетчер виртуальных устройств Android").

У меня была такая же проблема при попытке запустить приложение в симуляторе Intel, когда приложение использовало предварительно скомпилированную библиотеку для ARM.

У меня тоже есть эта проблема, но для моей ситуации я использую свои библиотеки в другом проекте. И я не думаю, что это вопрос затмения или android-ndk.

Вы можете проверить эти советы, которые могут привести к UnsatisfiedLinkError и у меня все отлично работает, удачи:)

  1. должен следовать правилу именования интерфейса JNI (вы сказали, что загружали библиотеку раньше, так что вы можете игнорировать это), и библиотеки должны находиться в каталоге /your project/libs/armeabi/
  2. если вы убедитесь, что все вышеперечисленное сделано, то вы должны убедиться, что ваши сгенерированные библиотеки установлены в ваш app.apk, в противном случае он все равно не сможет найти библиотеку и выдает ошибку. Для этого щелкните правой кнопкой мыши имя проекта Eclipse и перейдите в " Путь сборки" - " Настроить путь сборки", в левом меню выберите " Путь сборки Java", затем перейдите на вкладку " Порядок и экспорт " на правой панели, отметив флажок перед имя вашей библиотеки и нажмите OK, затем очистите, перестройте и запустите ваш проект, и ваши библиотеки будут установлены в app.apk, все готово.

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

РЕДАКТИРОВАТЬ:

  1. в слове, UnsatisfiedLinkError генерируются, если библиотека не установлена ​​в ваш app.apk, поэтому она не может быть успешно связана.

В моем случае при создании системного приложения проблема была связана с разрешениями. После помещения файлов ".so" в /system/lib/ или же /system/vendor/lib/ каталог, я изменил назначенные разрешения по умолчанию 600 на 755. Это работало хорошо.

Внутри папки libs я создаю новую папку с именем armeabi-v7a и копирую файл.so из armeabi в новую папку. Это решает ошибку.

У меня была та же проблема, и вот некоторые из проблем, которые у меня были с моим проектом:


  1. Изменение от System.load("hello-test"); в System.loadLibrary("hello-test");;
  2. Изменение сигнатуры функции C на JNIEXPORT jstring Java_com_example_testndk_TestNDK_funcNami(JNIEnv* env, jobject thiz): здесь вы используете Java_<java_package_name>_<java-class-name>_<function-name>;
  3. Добавление пути NDK к local.properties, в моем случае ndk.dir=<my-path-to-ndk-directory>; а также
  4. Обновление моего build.gradle также включить в defaultConfig: ndk { moduleName "hello-test" },

  • Имя пакета: com.example.testndk
  • Имя класса Java: TestNDK
  • Имя источника C: hello-test.c
  • Расположение каталога JNI в структуре проекта: AndroidProjects/TestNDK/app/src/main/jni

IDE: Android Studio 0.8.1.

Во-первых, проверьте, есть ли у вас файлы jni внутри папки libs в папке eclipse или jniLibs в Android Studio. Когда вы регистрируетесь в любом svn, перепроверьте также и в.so файлах.

Мой сценарий был при сборке со студией Android.

Когда вы создаете в Android Studio, ваша библиотека.so файлы или (jni) файлы должны находиться в папке \src\main\jniLibs\armeabi***. So.

где, как эти файлы будут внутри \libs\armeabi***. так в затмении.

При сборке с использованием eclipse и android studio вы должны изменить свой файл build.gradle как

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']
}

Здесь я строю проект, используя как андроид-студию, так и затмение.

Просто была похожая проблема.

Проверьте каталог /data/data/your.package.name/lib

Когда я нахожусь в моем каталоге пакета, в настоящее время он отображает:

lib -> /mismatched_uid/settings_10037/fs_1000

возможно, я случайно переключил sharedUserId и, таким образом, к библиотеке больше нельзя получить доступ.

Ни один из предыдущих ответов не решил мою проблему, но это помогло: все время проблема заключалась в том, что необходимый подкаталог и файл отсутствовали. Все, что у меня было в папке libs, - это папка armeabi, содержащая правильный файл.so, но должно быть еще 3, каждый с файлом.so в них. Пока не ясно, какой из трех других (armeabi-v7a, mips или x86) был требуемым, но я точно знаю, что все три были автоматически сгенерированы, когда я добавил файл Application.mk в ту же папку, что и Android.mk. файл, и убедитесь, что в нем есть следующая строка:

APP_ABI := all

Для меня эта строка - единственный текст там. Когда запускается ndk-build, файл Application.mk, очевидно, вызывает "все" 4 папки и надлежащие.so файлы, которые в них создаются. Как только я установил Application.mk, я снова запустил ndk-build, а затем выполнил чистую и понятную работу над моим проектом Eclipse, прежде чем пытаться снова. Все прошло отлично.

Я добавил

extern "C"

до объявления функций
например:

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

тогда ошибка исчезла

У меня просто так было, и проблема была в том, что на устройстве просто не хватало места для установки библиотеки. Я удалил некоторые другие приложения, и тогда это сработало.

Нет необходимости рутировать устройство.. разверните приложение на эмуляторе и просмотрите папку

Если у вас есть собственный проект с "libXYZ.so", убедитесь, что /system/lib/libXYZ.so не существует на вашем устройстве. Есть обходной путь: использовать

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

вместо System.loadLibrary ().

В моем случае библиотека .so загружена правильно, но не могу найти метод, как показано ниже:

Вызвано: java.lang.UnsatisfiedLinkError: Собственный метод не найден ...

После нескольких часов поиска, в чем может быть проблема, было замечено, что приложение выдает связанную ошибку только для производственной версии. Да, мы используем proguard для обфускации исходного кода, и он ломает класс обработчика библиотеки .so ... После добавления строк ниже в файл правил proguard. Все заработало как положено.

      -keepclasseswithmembers,allowshrinking,allowoptimization class com.zk.android.jni.Device {
native <methods>; }

Так что, если вы используете proguard и имеете аналогичную проблему с моей. Пожалуйста, проверьте файл proguard ...

Была идентичная проблема. Просто убрал проект и все заработало. Mystery..

Добавьте следующий код в свой файл Gradle

//libs is the location of your library's folder, It varies in diffarent projects like src/main/libs etc.
android {
  sourceSets.main {
    jniLibs.srcDir 'libs'
  }
}

Итак, Android Studio продолжает искать собственные библиотеки внутри папки jniLibs. этот код изменит путь к студии Android, чтобы искать библиотеки в папке libs

UnsatisfiedLinkerror решается этим. Создайте свой.so файл снова с помощью "ndk_build"

Другие вопросы по тегам