我有一个C ++框架,它在一个进程中运行并允许模块,我想要添加的一种模块是一个加载JAR然后在其中调用特定预定义函数的模块。可以有多个模块同时运行,因为用户需要,这提出了一个问题:
每个模块是否可以使用JNI_CreateJavaVM()创建单独的JVM,并且这些JVM将完全相互独立(但在同一过程中)?或者Java是否在内部依赖全局变量等会使它们相互干扰?
答案 0 :(得分:2)
您只能在每个进程中创建一个VM,并获得一个JNIEnv
。一些非常古老的JVM实现曾经支持创建多个VM,但不再是。
请参阅Oracle Java 7 JNI documentation中的 JNI_CreateJavaVM :
从JDK / JRE 1.2开始,不支持在单个进程中创建多个VM。
IBM's JDK 7 JNI documentation:
IBM i上的Java支持在单个作业或进程中仅创建一个Java虚拟机(JVM)。
(可能,同样的限制适用于IBM AIX JVM)
更详细here:
您无法在作业中多次成功调用JNI_CreateJavaVM(),并且JNI_GetCreatedJavaVMs()无法在结果列表中返回多个JVM。
支持在单个作业或进程中仅创建单个JVM遵循Oracle America,Inc。Java参考实现的标准。