Calling JNI_CreateJavaVM function twice(两次调用 JNI_CreateJavaVM 函数)
问题描述
我正在使用一个在库代码中调用 JNI_CreateJavaVM
函数的库.但是,我还需要一些 JNI Wrappings 并且我需要调用相同的函数 JNI_CreateJavaVM
以将 JNIEnv*
获取到我的应用程序.
I'm using a library that calls the JNI_CreateJavaVM
function inside the library code. However, I also need some JNI Wrappings and I need to call the same function JNI_CreateJavaVM
to get the JNIEnv*
to my application.
但是第二次调用失败了.
But the second call is failing.
有什么办法吗?
该库不支持获取或设置在该库中创建的JNIEnv*
.
The library does not support getting or setting the JNIEnv*
created inside the library.
推荐答案
你不能从同一个进程创建多个 JVM:
You cannot create more than one JVM from the same process:
从 JDK/JRE 1.2 开始,不支持在单个进程中创建多个 VM.
As of JDK/JRE 1.2 , creation of multiple VMs in a single process is not supported.
您可以使用 AttachCurrentThread
函数将当前线程附加到现有的 JVM.请参阅Invocation API 的文档.Java 15 中的等效文档 简单地说:
You may be able to attach your current thread to the existing JVM though using AttachCurrentThread
function. See the docs for the Invocation API. The equivalent document in Java 15 simply states:
不支持在单个进程中创建多个 VM.
Creation of multiple VMs in a single process is not supported.
您需要一个指向 JavaVM
对象的指针.看看 JNI_GetCreatedJavaVMs()
是否可以帮助你,我不确定这是每个进程(在这种情况下它只会是单个元素列表)还是每台机器.在任何一种情况下,JavaVM
都必须是库正在使用的那个,否则你可能不会做你想做的事.如果您可以访问它,那么您应该能够对 Java 应用程序中的其他对象进行调用,但要确保它是线程安全的.
You will need a pointer to the JavaVM
object. See if JNI_GetCreatedJavaVMs()
can help you, I'm not sure if this is per-process (in which case it will only ever be a single element list) or per machine. In either case the JavaVM
will have to be the one that the library is using or you probably will not be doing what you want. If you can access that then you should be able to make invocations on other objects in your Java application, but make sure that it is thread-safe.
这篇关于两次调用 JNI_CreateJavaVM 函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:两次调用 JNI_CreateJavaVM 函数
- Eclipse 的最佳 XML 编辑器 2022-01-01
- 如何使 JFrame 背景和 JPanel 透明且仅显示图像 2022-01-01
- 未找到/usr/local/lib 中的库 2022-01-01
- 获取数字的最后一位 2022-01-01
- GC_FOR_ALLOC 是否更“严重"?在调查内存使用情况时? 2022-01-01
- 转换 ldap 日期 2022-01-01
- 在 Java 中,如何将 String 转换为 char 或将 char 转换 2022-01-01
- 将 Java Swing 桌面应用程序国际化的最佳实践是什么? 2022-01-01
- 如何指定 CORS 的响应标头? 2022-01-01
- java.lang.IllegalStateException:Bean 名称“类别"的 BindingResult 和普通目标对象都不能用作请求属性 2022-01-01