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
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.
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.
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.
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