java - 如何在 DllMain 调用中维护 JVM 指针并防止调用 JNI_CreateJavaVM 两次

标签 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 删除了我之前创建的每个变量。

最佳答案

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

关于java - 如何在 DllMain 调用中维护 JVM 指针并防止调用 JNI_CreateJavaVM 两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43120838/

相关文章:

java - 将 txt 行存储到 ArrayList 时内存不足

Java:如何读取目录文件夹,计算并显示文件数量并复制到另一个文件夹?

java - SecurityConfig Java 文件错误

java - 在 HP Load Runner 的 VuGen 中加载 javai.dll 时出错

c# - ASP.NET 网络应用程序 : Unable to read DLL

java - 如何从 JSON 中提取在同一 JSON 中返回两个字符串的字段

c++ - 为什么我的 AVL 树排序算法比插入排序算法花费的时间更长?

c++ - 对字符串使用 set_union

c++ - 省略参数名称,C++ vs C

xml - Lua 新用户正在寻找有关 WoW 和 luaxml 的一些答案