JNI и UnsatisfiedLinkError - PullRequest
       0

JNI и UnsatisfiedLinkError

1 голос
/ 23 сентября 2011

Я делаю первые шаги с помощью 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-файл, содержащий все файлы (за исключением скомпилированных).

Перепробовал все, но это все та же проблема.
Вот те шаги, которые я сделал:

  1. Написать Hello.java
  2. Скомпилируйте Hello.java, используя javac Hello.java
  3. Создать файл заголовка, используя javah -jni Hello
  4. Записать файл Hello.c
  5. Скомпилируйте файл Hello.c, используя
    gcc Hello.c -shared -o Hello.dll -I"C:\Java\jdk1.7.0\include" -I"C:\Java\jdk1.7.0\include\win32"
  6. Выполнить Hello.class, используя java Hello

Спасибо.

РЕШЕНИЕ

Добавление -Wl,--kill-at к команде gcc устраняет проблему, согласно этому вопросу здесь.
Спасибо А.Х. за помощь!

1 Ответ

3 голосов
/ 23 сентября 2011

Пожалуйста, проверьте:

  • Имя вашей библиотеки: HelloJavaDLL.dll (в Windows)
  • Каталог DLL находится либо в пути поиска библиотеки (т.е. PATH переменная окружения), либо предоставлен java с -Djava.library.path=C:\WhereEverItIs.

Второй вопрос: JNI поддерживает и C и C ++ прямо из коробки. Если вы посмотрите в сгенерированный заголовочный файл и в файле jni.h, вы увидите это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...