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

时间:2013-07-08 09:21:15

标签: java dll java-native-interface

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

这是一个示例场景:

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

请建议我如何实施它,如果你有一个很好的教程资源,可以建议。

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

2 个答案:

答案 0 :(得分:1)

首先,您可以使用

获取课程参考
 FindClass 

之后,您可以使用

获取该类函数的函数id
 GetStaticMethodID and GetMethodID

然后用

运行
 CallStaticVoidMethod, CallStaticIntMethod, and CallStaticObjectMethod...

所有这些都需要使用JVM(如果你已经从javah.exe派生了头文件和c ++,那么你已经有了这个,所以可以跳过JVM创建),

JNIEnv* create_vm(JavaVM ** jvm) {

    JNIEnv *env;
    JavaVMInitArgs vm_args;

    JavaVMOption options; 
    //Path to the java source code     
    options.optionString = "-Djava.class.path=D:\\Java Src\\TestStruct"; 
    vm_args.version = JNI_VERSION_1_6; //JDK version. This indicates version 1.6
    vm_args.nOptions = 1;
    vm_args.options = &options;
    vm_args.ignoreUnrecognized = 0;

    int ret = JNI_CreateJavaVM(jvm, (void**)&env, &vm_args);
    if(ret < 0)
        printf("\nUnable to Launch JVM\n");       
    return env;
}

实施例(C ++):

 jclass clas;
 clas=FindClass("projectHello/helloWorldClass");
 jmethodID meth;
 meth = env->GetStaticMethodID(clas, "sayHello", "(I)V");
 env->CallStaticVoidMethod(clas, meth,val); //val is (I) ---> parameter. Return type V ---->void

如果您不了解课程背后的内容,您应该检查错误,例如

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

答案 1 :(得分:1)

这是如何调用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);
}

它来自http://journals.ecs.soton.ac.uk/java/tutorial/native1.1/implementing/method.html