C++调用Java JNI:如何为Java 9 JVM设置模块路径?
在C++中为Java 9+ JVM指定模块路径
这确实是Java模块化系统(JPMS)引入后常见的迁移问题!Java 9及以后版本新增了模块路径的概念,我们可以通过--module-path(简写-p)选项来指定模块的查找路径,同时结合--add-modules声明需要加载的模块(尤其是自定义模块或非默认导出的JDK模块)。
具体代码示例
对比你原来的Java 8代码,调整后的Java 9+版本代码如下:
// 创建JVM选项数组:包含模块路径和要添加的模块 JavaVMOption* options = new JavaVMOption[2]; // 指定模块路径,多个路径用分号(Windows)/冒号(Linux/macOS)分隔 options[0].optionString = (char *)"--module-path=./my-modules;./third-party-modules"; // 显式添加需要使用的模块,多个模块用逗号分隔 options[1].optionString = (char *)"--add-modules=com.my.custom.module,java.sql"; JavaVMInitArgs vm_args; vm_args.version = JNI_VERSION_9; // 对应Java 9的JNI版本,可根据实际JDK版本调整(如JNI_VERSION_17) vm_args.nOptions = 2; vm_args.options = options; vm_args.ignoreUnrecognized = false;
关键选项说明
--module-path(或-p):作用类似传统的类路径,但专门用于模块化代码,用来指定存放模块化JAR包或模块目录的路径。路径分隔规则和java.class.path一致(Windows用;,Unix/Linux/macOS用:)。--add-modules:如果你的代码依赖的模块不是JVM默认加载的(比如自定义模块、或者像java.sql这类非基础模块),需要通过这个选项显式声明要加载的模块,多个模块用逗号分隔。- 保留类路径:如果项目同时存在模块化和非模块化代码,可以继续保留
-Djava.class.path选项,把它加入到options数组中即可,JVM会同时处理模块路径和类路径。
注意事项
- 务必将
vm_args.version设置为对应Java版本的JNI常量,比如Java 11用JNI_VERSION_11,确保JVM初始化时匹配正确的版本。 - 路径要根据实际项目结构调整,避免出现找不到模块的问题。
内容的提问来源于stack exchange,提问作者Vitaliy Tsirkunov
相关产品推荐
相关产品推荐

