Wywoływanie C++ dll z Javy

Używam Javy dla małej aplikacji. To przepisanie istniejącego projektu MFC. Istnieje istniejąca biblioteka dll, którą muszę zmienić, aby umożliwić dostęp z Javy za pomocą JNI. Cała ta Java jest dla mnie nowa, więc mam mały problem i czuję się dość gęsty, gdy czytam inne posty na forum. W istniejącym dll mam taką funkcję:

extern "C" __declspec(dllexport) bool Create()
{
     return TRUE;
}
Czas na głupie pytania. Jak poprawnie skonfigurować go do wywoływania przez Javę?

Próbowałem tego:

JNIEXPORT jboolean JNICALL Create()
{
     return TRUE;
}

I ' m łącznie z jni.h i wszystko dobrze się komponuje. Jednak, gdy wywołuję go z Javy, dostaję UnsatisfiedLinkError. Wywołuję to z Javy używając tego:

public static native boolean CreateSession();

System.load("D:\\JavaCallTest.dll");
Create();
Czy ktoś mógłby mnie popchnąć we właściwym kierunku? Szczerze doceniam każdą pomoc.

Dzięki,

Nick

Author: nickfinity, 2012-02-28

3 answers

Musisz dołączyć nazwę klasy Java i ścieżkę do kodu natywnego, na przykład jeśli twoja metoda natywna została zadeklarowana w Javie jako:

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

A ścieżka klasy była (na przykład) com.example.NativeCode zadeklarowałbyś swoją metodę w natywny sposób w następujący sposób:

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

Wszystkie metody JNI mają wskaźnik i klasę JNIEnv jako dwa pierwsze parametry.

 7
Author: GooseSerbus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-24 14:57:08

Statyczna metoda natywna wymaga jeszcze co najmniej dwóch parametrów:

JNIEnv *env
jclass clazz

Nazwa funkcji musi również odpowiadać strukturze pakietu java.

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

Najlepiej byłoby użyć narzędzia javah do utworzenia pliku nagłówkowego z klasy java deklarującej natywną metodę, a następnie zaimplementować deklarowane prototypy funkcji.

 2
Author: Jörn Horstmann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-28 16:46:33

Miałem podobny problem-istniejącą bazę kodu C, do której potrzebowałem dostępu z Javy. Opłaciło mi się zapoznać z SWIG, narzędziem do generowania pośredniej biblioteki C++ (która wywołuje kod C), plus kodu Javy, który wywołuje bibliotekę C++.

Jeśli masz więcej niż 1 funkcję DLL do zawinięcia, może się opłacić sprawdzenie tego narzędzia, w przeciwnym razie będziesz musiał zapoznać się z JNI...

EDIT :

Wygląda na to, że Twój DLL nie jest znalezione przez wywołanie System.load(). Możesz spróbować System.loadLibrary(), ale pamiętaj, że Twoja biblioteka DLL musi znajdować się w ścieżce oznaczonej przez właściwość Java system java.library.path. Również w tym przypadku nie przekazuj pełnej nazwy pliku, ale tylko nazwę pliku bez rozszerzenia.

 1
Author: quaylar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-28 16:55:42