1

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

这是一个示例场景:

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

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

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

4

2 回答 2

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;}
于 2013-07-08T09:39:33.010 回答
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

于 2013-07-08T09:43:10.817 回答