我正在加载DLL而另一个程序调用我创建的函数。我通过JNI调用了一些java函数。
PS:我没有DLL方法调用的控件,它被称为我的另一个程序。
当我创建JVM时,我使用:JNI_CreateJavaVM。
在调用JNI方法之后,我使用以下命令销毁JVM: JNI_DestroyJVM()。
问题是当调用DLL中的函数时,我创建了JVM。但是,如果由于以下问题而失败,则JVM已经加载:
问题: Re-calling JNI_CreateJavaVM returns -1 after calling DestroyJavaVM
我知道我不能两次调用JNI_CreateJavaVM,因为: JNI_DestroyJVM(),它说“The JDK/JRE still does not support VM unloading, however。”只是不要调用它,也不要重新初始化它。
1 - 为什么在DLL_PROCESS_DETACH后,JVM仍然在内存中加载?
2 - 有没有办法在DllMain中存储全局变量? 也许我可以存储(JavaVM * jvm);指针,并且在dll调用之后不会破坏jvm,因此当调用dll的进程被破坏时它将被销毁。
由于我没有主程序,我只是有DLL调用,我无法存储全局变量,因为DLL_PROCESS_DETACH删除了我之前创建的每个变量。
答案 0 :(得分:2)
JNI_DestroyJVM
。请改为呼叫DetachCurrentThread
。JNI_CreateJavaVM
之前,请确保尚未创建JVM。使用JNI_GetCreatedJavaVMs
获取已加载JVM的实例,然后使用AttachCurrentThread
获取JNIEnv*
句柄。