如何在DllMain调用中保留JVM指针并防止调用JNI_CreateJavaVM两次

时间:2017-03-30 14:31:59

标签: java c++ dll jvm java-native-interface

我正在加载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删除了我之前创建的每个变量。

1 个答案:

答案 0 :(得分:2)

  • 如果您希望在流程生命周期中多次运行Java代码,请不要调用JNI_DestroyJVM。请改为呼叫DetachCurrentThread
  • 在调用JNI_CreateJavaVM之前,请确保尚未创建JVM。使用JNI_GetCreatedJavaVMs获取已加载JVM的实例,然后使用AttachCurrentThread获取JNIEnv*句柄。