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 函数
基础教程推荐
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- 在螺旋中写一个字符串 2022-01-01
- 如何强制对超级方法进行多态调用? 2022-01-01
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- 如何对 HashSet 进行排序? 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01