我正在加载一个 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 删除了我之前创建的每个变量。
最佳答案
- 如果您希望在进程生命周期内多次运行 Java 代码,请勿调用
JNI_DestroyJVM
。调用DetachCurrentThread
相反。 - 在调用
JNI_CreateJavaVM
之前,请确保尚未创建 JVM。使用JNI_GetCreatedJavaVMs
获取已加载 JVM 的实例,然后AttachCurrentThread
获取JNIEnv*
句柄。
关于java - 如何在 DllMain 调用中维护 JVM 指针并防止调用 JNI_CreateJavaVM 两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43120838/