gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 02:11:46 30 4
gpt4 key购买 nike

我正在加载一个 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com