създаване на 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 наведнъж. Има #ако. Той стартира само един в зависимост от версията на 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