java - JNI_CreateJavaVM() 每次我运行我的应用程序时都会失败(确切地说)

标签 java c++ visual-studio visual-studio-2010 java-native-interface

我有一个 Windows MFC 应用程序:

(1) 加载 JVM (JNI_CreateJavaVM())

(2) 将主线程附加到 JVM (AttachCurrentThread())

(3) 加载一些 Java 类和方法(FindClass()GetMethodID()/GetStaticMethodID())

(4) 注册一些本地回调以供 Java 代码使用 (RegisterNatives())

(5) 从 JVM 中分离线程 (DetachCurrentThread())

(6) 销毁 JVM (DestroyJavaVM())

所有上述功能每隔一段时间我运行该应用程序。我知道它们成功了,因为除了上述之外,我与应用程序交互并成功调用了 Java 静态方法,并且这些 Java 方法成功调用了我的 native 回调。我的应用程序正常退出,并且确定已执行预期的 Java 函数和 native 回调。

但是,每次我运行应用程序时,对 JNI_CreateJavaVM() 的调用都会失败(不会填充 JavaVM *)。 应用程序运行之间绝对没有任何变化。我只是简单地运行一次(成功,甚至没有除了上述 6 个步骤之外的任何操作),优雅地退出,再次运行,它失败了,来回。来来回回的成功/失败没有异常(exception) - 我可以运行它几十次,它在 JNI_CreateJavaVM() 行上精确地每隔一次在成功和失败之间振荡。

如有必要,我会粘贴更多代码。但是,我希望有人对我提供的内容有所了解。 (注意:这是一个 BCGSoft MFC 属性表应用程序,但我强烈怀疑它是否重要。)

最佳答案

看起来您遇到了 this bug (重述 here )这可能永远不会被修复。

尽管名称如此,DestroyJavaVM() 实际上并没有销毁 JVM。它所做的是向 JVM 发出它应该关闭的信号,但 JVM 实际上会等到除 Main 线程之外的所有线程都已停止后,它才会真正关闭。事实上,即使那样它也不会完全清理自己,因为 the documentation状态(相当 cryptically ):“然而,JDK/JRE 仍然不支持 VM 卸载。”

此外,我还担心您的第 2 步“将主线程附加到 JVM”。您不需要将创建 JVM 的线程附加到 JVM,也可以不分离该线程。如果您真的这样做了,那么很可能就是您的系统出了问题。 (创建 JVM 的线程是 JVM 的“主”线程。如果其他 native 线程需要访问它,您只需将它们附加/分离到 JVM。)

顺便说一句,JNI_CreateJavaVM() 成功时返回 0,而您说它在“失败”时返回 0,那么它在什么意义上失败了?您使用的是哪个 JVM(版本、供应商)?

关于java - JNI_CreateJavaVM() 每次我运行我的应用程序时都会失败(确切地说),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10443566/

相关文章:

javascript - 在解析期间检测内容中的正则表达式

visual-studio - 在单独的层中复制多个项目文件还是在创建Docker镜像时一次性复制多个项目文件更好?

c++ - 查找 2 个 3D 点之间的距离

c++ - 在 Windows 中渲染背景桌面的实时预览

java - NoClassDefFoundError 有时对于 System.out.close() 之后的标准类

java - 用 Java 登录 Facebook

c# - VS2017只用getter封装?

python - 如何获取命令提示符输出?为什么我在这段代码中无法获取它

java - 为什么下面的示例中 ArrayList 没有更新?

java - 如何从javafx中的另一个类将数据写入.txt文件(FileWriter)