java - JNI_CreateJavaVM 因采用 OpenJDK 11.0.8 而失败
问题描述
我们的 64 位 C 程序使用 JNI 实例化 JVM。目前我们正在使用 Adopt Open JDK 8.0.1920.12,一切正常。现在我们正在尝试迁移到 Adopt Open JDK 11.0.8.0。使用那个时,JNI_CreateJavaVM 总是返回 -1。
我所做的基本上是a)下载JDK(文件OpenJDK11U-jre_x64_windows_hotspot_11.0.8_10.zip)b)将其内容放入以前包含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);
不幸的是,相同的(负面)结果。
知道我做错了什么吗?
解决方案
我找到了我的问题的原因。我创建了一个最小的命令行 exe 并让它写入控制台。我收到此错误消息: <JAVA_HOME>/lib/ext 存在,不再支持扩展机制;请改用 -classpath。
在寻找时,我发现了这样的文章: https ://docs.oracle.com/javase/9/migrate/toc.htm#JSMIG-GUID-2C896CA8-927C-4381-A737-B1D81D964B7B
将我的 JRE 的“lib”目录中的“ext”文件夹重命名为例如“ext_go_away”后,JNI_CreateJavaVM 成功。
推荐阅读
- pandas - 拥有最多独特产品数量的 Top 3 首选商店的 shopid
- android-ndk - 在 protobuf 中使用“repeated”关键字时出现“ld: error: undefined symbol”
- javascript - 从对象内部的数组中删除除特定项之外的所有项目
- spring-cloud-dataflow - Spring Cloud Data Flow 的非选项参数
- python - 如何使用张量流计算自定义层中张量之间的操作
- sql - SQL - 非重复计数 (SQL Developer)
- sql-server - 首次尝试连接到 SQL Server 失败
- javascript - 如何从 Joi 中已定义的模式对象中访问/提取模式?
- php - 试图在 PHP LARAVEL 中获取非对象的属性
- javascript - 如何在 EJS 文件中预填充日期属性的值?