Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JNI和DLL:双向交互(回调)_Java_Dll_Java Native Interface - Fatal编程技术网

Java JNI和DLL:双向交互(回调)

Java JNI和DLL:双向交互(回调),java,dll,java-native-interface,Java,Dll,Java Native Interface,我正在开发一个供java使用的dll库。我有java程序员的经验。我已经看过关于如何使用JNI和如何创建DLL库的教程,但是我找不到关于如何让DLL像双向街道一样与java程序交互的好资源 这是一个示例场景: 在java应用程序中,它将调用本机方法callNativeMethod(),然后在dll callNativeMethod()中,它将需要调用java应用程序上的方法callJavaMethod()事件。如何从dll调用callJavaMethod() 请建议我如何实现它,可能的话,如果你

我正在开发一个供java使用的dll库。我有java程序员的经验。我已经看过关于如何使用JNI和如何创建DLL库的教程,但是我找不到关于如何让DLL像双向街道一样与java程序交互的好资源

这是一个示例场景:

在java应用程序中,它将调用本机方法callNativeMethod(),然后在dll callNativeMethod()中,它将需要调用java应用程序上的方法callJavaMethod()事件。如何从dll调用callJavaMethod()

请建议我如何实现它,可能的话,如果你有一个很好的教程资源


//编辑:所以正确的术语是回调=P

首先,您可以使用

 FindClass 
之后,您可以使用

 GetStaticMethodID and GetMethodID
然后和

 CallStaticVoidMethod, CallStaticIntMethod, and CallStaticObjectMethod...

所有这些都需要用JVM(如果已经有了来自JavaH.EXE的派生头和C++,那么已经有了这样可以跳过JVM创建),

如果您不是舒尔,那么您应该检查以下错误:

 if (env->ExceptionCheck()) {return ERR_GET_STATIC_METHOD_FAILED;}

这是一个如何调用Java方法的示例

void callback(int depth) {
   ...
}
表格C代码

JNIEXPORT void JNICALL
Java_Callbacks_nativeMethod(JNIEnv *env, jobject obj, jint depth) {
  jclass cls = (*env)->GetObjectClass(env, obj);
  jmethodID mid = (*env)->GetMethodID(env, cls, "callback", "(I)V");
  if (mid == 0)
    return;
  printf("In C, depth = %d, about to enter Java\n", depth);
  (*env)->CallVoidMethod(env, obj, mid, depth);
  printf("In C, depth = %d, back from Java\n", depth);
}
从这里开始

看看。看看,除非你只是对学习JNI的细节感兴趣。JNA允许您直接调用DLL方法,并支持将DLL回调到Java方法,而无需编写任何其他本机代码。
void callback(int depth) {
   ...
}
JNIEXPORT void JNICALL
Java_Callbacks_nativeMethod(JNIEnv *env, jobject obj, jint depth) {
  jclass cls = (*env)->GetObjectClass(env, obj);
  jmethodID mid = (*env)->GetMethodID(env, cls, "callback", "(I)V");
  if (mid == 0)
    return;
  printf("In C, depth = %d, about to enter Java\n", depth);
  (*env)->CallVoidMethod(env, obj, mid, depth);
  printf("In C, depth = %d, back from Java\n", depth);
}