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

Можно ли создать 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. Есть идеи, как заставить это работать?

Спасибо.


person DR.    schedule 14.02.2010    source источник
comment
Я собирался спросить SO, возможно ли иметь JNIEXPORT функции в приложении C ++, которое вызывает JVM, и я думаю, что этот вопрос отвечает на мой (нет).   -  person StockB    schedule 18.01.2013


Ответы (2)


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

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

person bmargulies    schedule 14.02.2010
comment
Почему вы говорите, что у него одновременно много JVM? Есть #if. Он запускает только один в зависимости от версии JDK - person Bob Yoplait; 14.06.2011
comment
Если он уже использует метод JNI, значит, у него есть одна JVM, и он пытается создать вторую. - person bmargulies; 14.06.2011
comment
Хорошо, я пропустил тот факт, что он вызывал C ++ из Java, хотя основным процессом был C ++, это когда вы используете JNI_CreateJavaVM () - person Bob Yoplait; 27.06.2011

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

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

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

person DR.    schedule 14.02.2010
comment
Интересно. Я как бы хочу попробовать это просто так. :) - person Tom; 14.02.2010