gpt4 book ai didi

java - JNI 和 DLL : Two way interaction (callback)

转载 作者:行者123 更新时间:2023-11-30 04:19:15 25 4
gpt4 key购买 nike

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

这是一个示例场景:

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

请建议我如何实现它,以及您是否有很好的教程资源。

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

最佳答案

首先你可以使用获取类引用

 FindClass 

之后,您可以使用以下方法获取该类函数的函数ID

 GetStaticMethodID and GetMethodID

然后运行

 CallStaticVoidMethod, CallStaticIntMethod, and CallStaticObjectMethod...

所有这些都需要使用 JVM(如果您已经从 javah.exe 派生了 header 和 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;}

关于java - JNI 和 DLL : Two way interaction (callback),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17523056/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com