Android NDK java.lang.UnsatisfiedLinkError: findLibrary вернул ноль - PullRequest
51 голосов
/ 27 января 2012

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

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

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

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

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

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

Ответы [ 15 ]

15 голосов
/ 28 декабря 2013

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

System.loadLibrary("XYZ");
13 голосов
/ 31 июля 2013

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

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

11 голосов
/ 31 мая 2013

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

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

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

enter image description here

enter image description here

enter image description here

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

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

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

6 голосов
/ 08 января 2014

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

5 голосов
/ 09 июля 2014

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


  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.

4 голосов
/ 05 февраля 2015

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

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

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

где, поскольку эти файлы будут внутри \ libs \ armeabi ***., Поэтому в eclipse.

При сборке с использованием 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']
}

Здесь я строю проект, используя как android studio, так и eclipse.

2 голосов
/ 25 сентября 2014

Ни один из предыдущих ответов не решил мою проблему, но это помогло: все время проблема заключалась в том, что необходимый подкаталог и файл отсутствовали.Все, что у меня было в папке 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, прежде чем пытаться снова.Все прошло отлично.

2 голосов
/ 27 июня 2012

только что была похожая проблема.

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

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

lib -> /mismatched_uid/settings_10037/fs_1000

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

1 голос
/ 03 ноября 2016

Я добавил

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());
}

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

...