2011-01-27 6 views
4

java.lang.UnsatisfiedLinkErrorjava.lang.UnsatisfiedLinkError

Я использую привет-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 !"); 
} 

exception trace

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

+0

Информация слишком мало. где находится .so вы ставите и что такое имя файла? Что такое аргумент вашей System.loadLibrary() – qrtt1

+0

, что вообще помогает? –

+1

Хммм. Выглядит хорошо. Пожалуйста, покажите результат «arm-eabi-nm libhello-jni.so» и заголовочный файл. – qrtt1

ответ

5

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

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

+2

Это может быть тривиальный вопрос, но как это сделать вручную? Я пишу это через затмение и нажимая кнопку воспроизведения, чтобы скомпилировать все, что угодно: –

+0

javah -jni YourClassWithFullName – qrtt1

+0

есть учебник по быстрому старту http://java.sun.com/developer/onlineTraining/Programming/JDCBook/jniexamp. html # sol – qrtt1

4

см андроид-NDK-R8b/documentation.html для получения дополнительной информации.

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

APP_ABI := armeabi armeabi-v7a x86 

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

0

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

0

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

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

и lib1 зависит от lib2, вам нужен груз Lib2 первый.

+0

еще лучше: ndk-зависит от Android SDK, который может быть использован для получения правильного порядка загрузки динамических библиотек. Просто введите ndk-depends --print-java <путь к вашему файлу> – NoAngel

Смежные вопросы