我正在为java使用开发一个dll库。我是java程序员。我已经看过如何使用JNI以及如何创建DLL库的教程,但是我找不到一个关于如何让dll与java程序交互的好资源,如双向街道。
这是一个示例场景:
在java应用程序中,它将调用本机方法callNativeMethod(),然后在dll callNativeMethod()中,将有一个事件需要在java应用程序上调用一个方法,即callJavaMethod()。如何从dll调用callJavaMethod()。
请建议我如何实施它,如果你有一个很好的教程资源,可以建议。
//编辑:所以正确的术语是回调。 = P
答案 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