создание JVM из метода JNI - PullRequest
       45

создание JVM из метода JNI

7 голосов
/ 14 февраля 2010

Можно ли создать JVM из метода JNI, используя JNI API?

Я пытался сделать это с помощью функции 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 () завершился ошибкой. Приведенный выше код является частью нативного метода, написанного на C ++, который вызывается из Java. Любые идеи о том, как заставить это работать? </p>

Спасибо.

Ответы [ 2 ]

6 голосов
/ 14 февраля 2010

Нет, вы не можете. Это задокументированное ограничение, что вы можете иметь только одну JVM за раз. API предназначен для возможности расширения, но расширения никогда не было.

Если вы используете метод JNI, то уже есть одна JVM, и все, что вы получаете - это одна JVM на процесс.

1 голос
/ 14 февраля 2010

Я понимаю, что вы имеете в виду: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4479303

В отчете об ошибке говорится, что невозможно запустить несколько JVM в одном и том же адресном пространстве. Должен сказать, что я немного удивлен, что JNI_CreateJavaVM () не отключает новую JVM в другом адресном пространстве.

Поскольку JNI_CreateJavaVM () не обрабатывает сам новый процесс, возможно ли вручную отключить другой процесс JVM из метода JNI и впоследствии использовать IPC для управления им? Если так, каков наилучший способ сделать это? Литеральная fork () / exec () не кажется хорошей идеей, потому что она скопирует все (возможно, очень большое) адресное пространство JVM только для того, чтобы сразу выбросить его.

...