Я делаю первые шаги с помощью JNI и пытался написать простую Hello Java программу, но она завершается с ошибкой:
Exception in thread "main" java.lang.UnsatisfiedLinkError: HelloJava.dostuff()V
at HelloJava.dostuff(Native Method)
at HelloJava.main(HelloJava.java:12)
Это мой класс Java:
class HelloJava {
private native void dostuff();
static {
System.loadLibrary("HelloJavaDLL");
}
public static void main(String[] args) {
System.out.println("This is from java.");
HelloJava j = new HelloJava();
j.dostuff();
}
}
HelloJava.c генерируется с использованием javah -jni HelloJava
.
Реализация C выглядит следующим образом:
#include <stdio.h>
#include <jni.h>
#include "HelloJava.h"
JNIEXPORT void JNICALL Java_HelloJava_dostuff
(JNIEnv *env, jobject this)
{
printf("And this comes from C ! :)\n");
}
Я скомпилировал его в Windows, используя gcc для общей библиотеки (.dll).
Теперь при запуске файла Java .class возникает исключение сверху. Можете ли вы сказать мне, почему появляется эта ошибка?
И, кстати, подскажите, как я могу использовать JNI с C ++?
UPDATE
Может быть, вы хотите попробовать сами? Я действительно не могу найти проблему. Вот ссылка на MediaFire , где вы можете скачать ZIP-файл, содержащий все файлы (за исключением скомпилированных).
Перепробовал все, но это все та же проблема.
Вот те шаги, которые я сделал:
- Написать Hello.java
- Скомпилируйте Hello.java, используя
javac Hello.java
- Создать файл заголовка, используя
javah -jni Hello
- Записать файл Hello.c
- Скомпилируйте файл Hello.c, используя
gcc Hello.c -shared -o Hello.dll -I"C:\Java\jdk1.7.0\include" -I"C:\Java\jdk1.7.0\include\win32"
- Выполнить Hello.class, используя
java Hello
Спасибо.
РЕШЕНИЕ
Добавление -Wl,--kill-at
к команде gcc устраняет проблему, согласно этому вопросу здесь.
Спасибо А.Х. за помощь!