java.lang.UnsatisfiedLinkError

java.lang.UnsatisfiedLinkError

Я использую пример hello-jni и по какой-то причине получаю ошибку java.lang.UnsatisfiedLinkError, когда пытаюсь вызвать библиотеку hello-jni. Есть идеи, почему? Должен ли я где-то указать свой путь?

в HelloJni.java:

public native String  stringFromJNI();

а также

static {
    System.loadLibrary("hello-jni");
}

в привет-jni.c:

jstring
Java_com_bdunlay_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
                                                  jobject thiz )
{
    return (*env)->NewStringUTF(env, "Hello from JNI !");
}

трассировка исключений

файл .so... root_root/libs/armeabi/libhello-jni.so


person Brian D    schedule 27.01.2011    source источник
comment
Информации слишком мало. где находится .so, который вы поместили, и какое имя файла? Каков аргумент вашей System.loadLibrary()   -  person qrtt1    schedule 27.01.2011
comment
Хм. Это выглядит хорошо. Пожалуйста, покажите результат 'arm-eabi-nm libhello-jni.so', а также заголовочный файл.   -  person qrtt1    schedule 27.01.2011
comment
arm-eabi-nm libhello-jni.so: без символов. Ха-ха, обидно. У меня не было заголовочного файла в моем проекте! Я бы поставил вам галочку, если бы вы ответили, убедитесь, что вы включили файлы заголовков!   -  person Brian D    schedule 27.01.2011
comment
Нужно ли включать файл jni.h в каждый проект, использующий NDK?   -  person Brian D    schedule 27.01.2011
comment
вы должны правильно сгенерировать заголовок из класса java.   -  person qrtt1    schedule 27.01.2011


Ответы (4)


у вашего родного нет JNIEXPORT. Обычно он объявляется в заголовочном файле с объявлением функции.

Мы будем использовать javah -jni для генерации заголовка

person qrtt1    schedule 27.01.2011
comment
Это может быть тривиальный вопрос, но как мне сгенерировать это вручную? Я пишу это через eclipse и нажимаю кнопку воспроизведения, чтобы скомпилировать все простым способом :) - person Brian D; 27.01.2011
comment
javah -jni ВашКлассСПолнымИменем - person qrtt1; 27.01.2011
comment
есть краткое руководство java.sun.com/developer/onlineTraining /Программирование/JDCBook/ - person qrtt1; 27.01.2011
comment
в root/src/com/bdunlay/hellojni я запустил javah -jni HelloJni.java и получил такой ответ: $ javah -jni HelloJni.java/error: невозможно получить доступ к файлу HelloJni.java/class для HelloJni .java не найден / javadoc: ошибка — класс HelloJni.java не найден. / Ошибка: в командной строке не были указаны классы. Попробуйте - помогите. / Я также запускал его без .java, и он сказал, что класс также не найден. - person Brian D; 27.01.2011
comment
javah будет анализировать байт-код, а не исходный код. Сначала вам нужно скомпилировать HelloJni.java в HelloJni.class. - person qrtt1; 27.01.2011
comment
Ну, это андроид - я не совсем компилирую классы напрямую. Что мне действительно удалось сделать, так это принудительно перестроить все с помощью инструмента ndk-build Android ndk, и это, похоже, сгенерировало правильные заголовки. Спасибо за помощь. - person Brian D; 27.01.2011
comment
Заголовок не будет часто меняться, если вы достаточно хорошо определили «интерфейс». Как бы то ни было, классы могут быть из других скомпилированных, например .jar. Javah может установить путь к классам, указывающий на него. - person qrtt1; 27.01.2011

Дополнительную информацию см. в android-ndk-r8b/documentation.html.

По умолчанию образец не включает файл Application.mk (в папке /jni/). Я исправил проблему, добавив этот файл в свой проект и добавив следующую единственную запись, которая позволяет создавать встроенные файлы для нескольких типов ЦП (особенно для x86 в моем случае):

APP_ABI := armeabi armeabi-v7a x86

После добавления этого файла вы можете снова запустить ndk-build, чтобы создать необходимые файлы, а затем собрать APK как обычно.

person iDurocher    schedule 01.11.2012

java.lang.UnsatisfiedLinkError: Исключение собственного метода не найдено для методов из OpenCV означает, что вы пытаетесь использовать OpenCV до его инициализации. Вы можете использовать объекты OpenCV и вызывать методы из библиотеки только после onManagerConnected со статусом LoaderCallbackInterface.SUCCESS.

person Lina Shyshova    schedule 03.09.2013

В моем случае причиной ошибки было: Если у вас загружено несколько библиотек как

System.loadLibrary("lib1");
System.loadLibrary("lib2");

и lib1 зависит от lib2, вам нужно сначала загрузить lib2.

person NoAngel    schedule 08.12.2014
comment
еще лучше: ndk-depends из Android SDK можно использовать для получения правильного порядка загрузки ваших динамических библиотек. Просто введите ndk-depends --print-java ‹путь к вашему so-файлу› - person NoAngel; 08.12.2014