Вызов C ++ dll из Java - PullRequest
       10

Вызов C ++ dll из Java

10 голосов
/ 28 февраля 2012

Я использую Java для небольшого приложения. Это переписать существующий проект MFC. Существует существующая dll, которую мне нужно изменить, чтобы разрешить доступ из Java с использованием JNI. Все эти вещи Java являются новыми для меня, поэтому у меня возникли небольшие проблемы и я чувствую себя довольно плотно, когда читаю другие сообщения на форуме. В существующей DLL у меня есть такая функция:

extern "C" __declspec(dllexport) bool Create()
{
     return TRUE;
}

Время тупого вопроса. Как правильно настроить его так, чтобы он вызывался Java?

Я пробовал это:

JNIEXPORT jboolean JNICALL Create()
{
     return TRUE;
}

Я включаю jni.h, и все прекрасно компилируется. Однако, когда я вызываю его из Java, я получаю UnsatisfiedLinkError. Я звоню из Java, используя это:

public static native boolean CreateSession();

System.load("D:\\JavaCallTest.dll");
Create();

Может ли кто-нибудь любезно подтолкнуть меня в правильном направлении? Я искренне ценю любую помощь.

Спасибо

Ник

Ответы [ 3 ]

7 голосов
/ 28 февраля 2012

Вам необходимо включить имя и путь класса Java в ваш собственный код, например, если ваш собственный метод был объявлен в Java как:

public class NativeCode {
    public static native boolean CreateSession();
}

и путь к классу был (например) com.example.NativeCode, вы бы объявили свой метод на нативном языке следующим образом:

extern "C"
JNIEXPORT jboolean JNICALL Java_com_example_NativeCode_CreateSession(JniEnv* env, jclass clazz)
{
    return JNI_TRUE;
}

Все методы JNI имеют указатель и класс JNIEnv в качестве своих первых двух параметров.

2 голосов
/ 28 февраля 2012

Статическому собственному методу все еще нужны как минимум два параметра:

JNIEnv *env
jclass clazz

Имя функции также должно соответствовать структуре пакета java.

JNIEXPORT jboolean JNICALL Java_com_example_CreateSession(JNIEnv *env, jclass clazz)

В идеале вы должны использоватьинструмент javah для создания файла заголовка из класса java, объявляющего собственный метод, и затем реализующего объявленные прототипы функций.

1 голос
/ 28 февраля 2012

У меня была похожая проблема - существующая C-Codebase, к которой мне нужно было получить доступ из Java. Для меня это окупилось, познакомившись с SWIG , инструментом для генерации промежуточной C ++ DLL (которая вызывает C-Code), плюс Java-Code, который вызывает в C ++ DLL.

Если у вас есть более 1 функции DLL для переноса, возможно, стоит воспользоваться этим инструментом, иначе вам придется ознакомиться с JNI ...

EDIT

Похоже, что ваша DLL не найдена при вызове System.load(). Возможно, вы захотите попробовать System.loadLibrary(), но учтите, что ваша DLL должна быть расположена по пути, обозначенному системным свойством Java java.library.path. Также не передавайте полное имя файла в этом случае, а только имя файла без расширения.

...