Java 从JNI方法中创建JVM

Java 从JNI方法中创建JVM,java,jvm,java-native-interface,jvm-arguments,jvmti,Java,Jvm,Java Native Interface,Jvm Arguments,Jvmti,是否可以使用JNIAPI从JNI方法中创建JVM 我尝试使用JNI函数“JNI_CreateJavaVM()”来实现这一点,但它不起作用(该函数始终返回小于零的值) 下面是我正在使用的基本代码(C++): 其中USER_CLASSPATH包含我要加载的类的路径。执行上述代码后,res函数,我认为这个问题回答了我的问题(否)。 JNIEnv *env; JavaVM *jvm; jint res; #ifdef JNI_VERSION_1_2 JavaVMInitArgs vm_args; Ja

是否可以使用JNIAPI从JNI方法中创建JVM

我尝试使用JNI函数“JNI_CreateJavaVM()”来实现这一点,但它不起作用(该函数始终返回小于零的值)

下面是我正在使用的基本代码(C++):

其中USER_CLASSPATH包含我要加载的类的路径。执行上述代码后,res<0,表示JNI_CreateJavaVM()失败。上面的代码是用C++编写的一个用java编写的本地方法的一部分。你有什么办法让它发挥作用吗


谢谢。

不,你不能。一次只能有一个JVM是一个有文档记录的限制。API是为扩展的可能性而设计的,但扩展从未发生过

如果您使用的是JNI方法,那么已经有一个JVM,每个进程只有一个JVM。

我明白您的意思:

bug报告说不可能在同一地址空间中运行多个JVM。我不得不说,我有点惊讶JNI_CreateJavaVM()没有在不同的地址空间中派生出新的JVM


由于JNI_CreateJavaVM()本身并不分叉一个新进程,因此可以从JNI方法中手动分叉另一个JVM进程,然后使用IPC来管理它吗?如果是这样,最好的方法是什么?一个literal fork()/exec()似乎不是一个好主意,因为它会复制JVM的整个(可能非常大)地址空间,然后立即将其丢弃。

很有趣。我有点想尝试一下,只是为了好玩。:)你为什么说他一次有很多JVM。有一个“如果”。他只启动一个,取决于JDK版本,如果他已经在JNI方法中,那么他有一个JVM,并且试图创建一个第二个.OK,我跳过了他从java调用C++的事实,我认为主要过程是C++,就是在使用JNIOCCRATEJAVAVM()的时候。我想问一下,如果在C++应用程序中调用一个JVM,可以有<代码> jnExputix/Cuth>函数,我认为这个问题回答了我的问题(否)。
JNIEnv *env;
JavaVM *jvm;
jint res;

#ifdef JNI_VERSION_1_2
JavaVMInitArgs vm_args;
JavaVMOption options[2];
options[0].optionString =
    "-Djava.class.path=" USER_CLASSPATH;
options[1].optionString = "-verbose:jni";
vm_args.version = JNI_VERSION_1_2;
vm_args.options = options;
vm_args.nOptions = 2;
vm_args.ignoreUnrecognized = JNI_TRUE;
/* Create the Java VM */
res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);

#else

JDK1_1InitArgs vm_args;
char classpath[1024];
vm_args.version = 0x00010001;
JNI_GetDefaultJavaVMInitArgs(&vm_args);
/* Append USER_CLASSPATH to the default system class path */
sprintf(classpath, "%s%c%s",
        vm_args.classpath, PATH_SEPARATOR, USER_CLASSPATH);
vm_args.classpath = classpath;
/* Create the Java VM */
res = JNI_CreateJavaVM(&jvm, &env, &vm_args);

#endif /* JNI_VERSION_1_2 */