Я пытаюсь обернуть библиотеку c ++ для определенного USB-устройства в JAVA.библиотека поддерживает функции обратного вызова для информирования приложения о присоединении и отсоединении USB-устройства к ПК.
функция обратного вызова должна иметь определенный формат, например:
DWORD callbackFunction(void *params);
, поэтому я реализовалподобная функция в jll JNI и хочет вызывать функцию в Java Wapper всякий раз, когда эта функция вызывается.
вопрос в том, что JNIENV я должен использовать для вызова GetObjectClass, GetMethodID и CallVoidMethod из?
Так я инициализирую свою DLL.методы «Set (AttachDetach) Callback» принимают функцию обратного вызова (первый параметр) и параметр void * (второй параметр), которые будут переданы функции при обнаружении присоединения / отсоединения модуля.
JNIEXPORT void JNICALL Java_MyPackage_MyClass_InitializeDLL
(JNIEnv *env, jobject obj, jobject callback)
{
// Storing callback object in global variable.
callBackObj = callback;
env->GetJavaVM(&jvm);
MyInstance = new MyClass();
MyInstance ->SetAttachCallback(AttachCallBack, &callBackObj);
MyInstance ->SetDetachCallback(DetachCallBack, &callBackObj);
// Testing!
jclass callBackCls = env->FindClass("MyPackage/MyClassCallBacks");
jmethodID mid = env->GetMethodID(callBackCls, "attach", "(B)V");
if (!mid)
return ; /* method not found */
//This call here works well
env->CallVoidMethod(callBackObj, mid, 5);
}
затемЯ установил функцию обратного вызова в DLL для устройства USB, и она успешно вызывается при подключении устройства.
Код, который я вставил в функцию обратного вызова присоединения устройства USB, выглядит следующим образом:
DWORD CALLBACK AttachCallBack(CallbackParams* params)
{
JNIEnv *env;
jvm->AttachCurrentThread((void **)&env, NULL);
jclass callBackCls = env->FindClass("MyPackage/MyClassCallBacks");
jmethodID mid = env->GetMethodID(callBackCls, "attach", "(B)V");
if (!mid)
return -1; /* method not found */
// This call fails with an access violation Exception
env->CallVoidMethod(*((jobject *)(params->param)), mid, params->moduleIndex);
// This fails the same way too
env->CallVoidMethod(callBackObj, mid, 5);
jvm->DetachCurrentThread();
return 0;
}
До того, как я использовал AttachCurrentThread, я вообще не мог использовать указатель JNIENV.но теперь любое другое использование этого указателя является успешным вместо вызова CallVoidMethod.Вы понимаете, что здесь не так?
Позвольте мне добавить, что MyPackage.MyClassCallBacks - это интерфейс, который реализован в другом методе, а именно в "callBackClass"