【问题标题】:creating a JVM from within a JNI method从 JNI 方法中创建 JVM
【发布时间】:2011-01-16 15:02:18
【问题描述】:

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

我尝试使用 JNI 函数“JNI_CreateJavaVM()”来执行此操作,但它不起作用(该函数一直返回小于零的值)。

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

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 */

其中 USER_CLASSPATH 包含我要加载的类的路径。上述代码执行后,res

谢谢。

【问题讨论】:

  • 我想问 SO 是否可以在调用 JVM 的 C++ 应用程序中使用 JNIEXPORT 函数,我认为这个问题回答了我的问题(否)。

标签: java jvm java-native-interface jvm-arguments jvmti


【解决方案1】:

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

如果你在 JNI 方法中,那么已经有一个 JVM,每个进程只有一个 JVM。

【讨论】:

  • 你为什么说他一次有很多JVM。有一个#if。他根据JDK版本只启动一个
  • 如果他已经在一个 JNI 方法中那么他有一个 JVM 并且正在尝试创建第二个。
  • 好的,我跳过了他从Java调用C++的事实,虽然主要进程是C++,那是你使用JNI_CreateJavaVM()的时候
【解决方案2】:

我明白你的意思: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4479303

错误报告说不可能在同一个地址空间中运行多个 JVM。我不得不说我有点惊讶 JNI_CreateJavaVM() 没有在不同的地址空间分叉一个新的 JVM。

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

【讨论】:

  • 有趣。我有点想试试这个只是为了它。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多