7

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 < 0 となり、JNI_CreateJavaVM() が失敗したことを示します。上記のコードは、Java から呼び出される C++ で記述されたネイティブ メソッドの一部です。これを機能させる方法についてのアイデアはありますか?

ありがとう。

4

2 に答える 2

6

いいえ、できません。一度に 1 つの JVM しか持てないという制限事項が文書化されています。API は拡張の可能性のために設計されていますが、拡張は行われていません。

JNI メソッドを使用している場合は、すでに 1 つの JVM があり、プロセスごとに 1 つの JVM だけが得られます。

于 2010-02-14T03:22:10.597 に答える
1

あなたの言いたいことはわかります: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4479303

バグ レポートには、同じアドレス空間で複数の JVM を実行することはできないと書かれています。JNI_CreateJavaVM() が別のアドレス空間で新しい JVM をフォークしないことに少し驚いたと言わざるを得ません。

JNI_CreateJavaVM() は新しいプロセス自体をフォークしないため、JNI メソッド内から別の JVM プロセスを手動でフォークし、その後 IPC を使用してそれを管理することは可能ですか? もしそうなら、これを行う最善の方法は何ですか? リテラルの fork()/exec() は、JVM のアドレス空間全体 (おそらく非常に大きい) をコピーして、直後に破棄するため、良い考えとは思えません。

于 2010-02-14T04:19:35.903 に答える