Ошибка JNI_CreateJavaVM с Adopt OpenJDK 11.0.8

Наша 64-битная программа на C создает экземпляр JVM с использованием JNI. В настоящее время мы используем Adopt Open JDK 8.0.1920.12, и все работает нормально. Теперь пытаемся перейти на Adopt Open JDK 11.0.8.0. При использовании этого JNI_CreateJavaVM всегда возвращает -1.

В основном я сделал следующее: а) загрузил JDK (файл OpenJDK11U-jre_x64_windows_hotspot_11.0.8_10.zip) б) поместил его содержимое в папку, которая ранее содержала Java 8 JDK. Эту папку можно найти в переменной окружения PATH.

Наш код:

char* ipV4 = "-Djava.net.preferIPv4Stack=true";
opts[numopts++].optionString = ipV4;

// get path pointing to our Java classes
classpath = WfBuildJVMClasspathStr();
opts[numopts++].optionString = classpath;

//make sure we notify the JVM we are a service
sprintf(servicearg, "-Xrs");
opts[numopts++].optionString = servicearg;

vm_args.version = JNI_VERSION_1_2;
vm_args.options = opts;
vm_args.nOptions = numopts;
vm_args.ignoreUnrecognized = true;

status = JNI_CreateJavaVM(&jvm, (void **)&envP, &vm_args);

В качестве альтернативы я также попытался заменить последнюю строку следующим кодом:

char JVMExe[STRPATH + 1];
// make up path to the <JDK install>\bin\server\jvm.dll
sprintf(JVMExe, "%s\\jvm.dll", WF.JVMDir);
HINSTANCE hinstLib = LoadLibrary(TEXT(JVMExe));
typedef jint(JNICALL *PtrCreateJavaVM)(JavaVM **, void **, void *);
PtrCreateJavaVM ptrCreateJavaVM = (PtrCreateJavaVM)GetProcAddress(hinstLib, "JNI_CreateJavaVM");
status = ptrCreateJavaVM(&jvm, (void**)&envP, &vm_args);

К сожалению, тот же (отрицательный) результат.

Любая идея, что я делаю неправильно?


person Michael    schedule 21.07.2020    source источник
comment
Можете ли вы расширить свой пример? Как объявляются/определяются opts и serviceargs? Как вы компилируете и компонуете свою программу?   -  person Botje    schedule 21.07.2020
comment
Я удалил свой ответ, так как он, похоже, не решил проблему. Пара уточняющих вопросов: Можете ли вы показать нам результат WfBuildJVMClasspathStr? Можете ли вы подтвердить, что вы можете запустить рассматриваемую jvm, используя java -cp ... из той же установки? Почти наверняка это не имеет значения, но можете ли вы изменить true на JNI_TRUE? Можете ли вы привести минимальный воспроизводимый пример? Можете ли вы описать, что находится в вашем пути к классам, например, в банке с манифестом или классами? Кроме того, это долгий путь, но вам может понадобиться rt.jar, чтобы быть в пути к классам.   -  person PiRocks    schedule 21.07.2020


Ответы (1)


Я нашел причину своей проблемы. Я создал минимальный исполняемый файл командной строки и позволил ему писать в консоль. Я получил это сообщение об ошибке: ‹JAVA_HOME›/lib/ext существует, механизм расширений больше не поддерживается; Вместо этого используйте -classpath.

При поиске я нашел такие статьи: https://docs.oracle.com/javase/9/migrate/toc.htm#JSMIG-GUID-2C896CA8-927C-4381-A737-B1D81D964B7B

После переименования папки ext в каталоге lib моей JRE, например. ext_go_away JNI_CreateJavaVM выполнен успешно.

person Michael    schedule 22.07.2020