C+中的模块路径+;调用Java JNI 当我在C++中创建java 8 JVM时,我通常使用类似下面的代码来告诉JVM类路径: JavaVMOption* options = new JavaVMOption[1]; // JVM invocation options options[0].optionString = (char *)"-Djava.class.path=.;./lib2"; // where to find java .class vm_args.version = JNI_VERSION_1.8; // minimum Java version vm_args.nOptions = 1; // number of options vm_args.options = options; vm_args.ignoreUnrecognized = false;

C+中的模块路径+;调用Java JNI 当我在C++中创建java 8 JVM时,我通常使用类似下面的代码来告诉JVM类路径: JavaVMOption* options = new JavaVMOption[1]; // JVM invocation options options[0].optionString = (char *)"-Djava.class.path=.;./lib2"; // where to find java .class vm_args.version = JNI_VERSION_1.8; // minimum Java version vm_args.nOptions = 1; // number of options vm_args.options = options; vm_args.ignoreUnrecognized = false;,java,java-native-interface,java-9,java-module,jnienv,Java,Java Native Interface,Java 9,Java Module,Jnienv,但是如何告诉Java9JVM模块路径呢?没有java.module.path系统属性。我能找到的最好的东西是: JavaVMOption* options = new JavaVMOption[2]; // JVM invocation options options[0].optionString = (char *)"-Djdk.module.path=.;./lib2"; // where to find java .class options[1].optionString =

但是如何告诉Java9JVM模块路径呢?没有java.module.path系统属性。我能找到的最好的东西是:

JavaVMOption* options = new JavaVMOption[2];   // JVM invocation options
options[0].optionString = (char *)"-Djdk.module.path=.;./lib2";   // where to find java .class
options[1].optionString = (char *)"-Djdk.module.main=RemkaAgentService";   // where to find java .class
vm_args.version = JNI_VERSION_9;             // minimum Java version
vm_args.nOptions = 2;                          // number of options
vm_args.options = options;
vm_args.ignoreUnrecognized = false;

但这段代码不起作用,当我尝试创建JVM时,它失败了。我想这是因为它不支持我尝试的选项

因此正确的选择如下

JavaVMOption* options = new JavaVMOption[2];   // JVM invocation options
options[0].optionString = (char *)"--module-path=.;./lib2";   // where to find java .class
options[1].optionString = (char *)"--add-modules=RemkaAgentService,spring.context";

vm_args.version = JNI_VERSION_9;             // minimum Java version
vm_args.nOptions = 2;                          // number of options
vm_args.options = options;
vm_args.ignoreUnrecognized = false;     // invalid options make the JVM init fail

它不应该是
java.module.path
而不是
jdk.
?(只是相互关联)你从
JNI\u CreateJavaVM
中得到了什么?JNI CreateJavaVM是用来创建VM的,它不加载和执行主类。对于模块路径,将选项字符串指定为“-module path=.;./lib2”。还指定“-addmodules=RemkaAgentService”以确保解析初始模块。创建VM后,您可以使用FindClass加载主类并执行其主方法。jdk.module.path是只读属性,记录在System.getProperties implNote中。在命令行和JNI CreateJavaVM上,选项是
--module path
。java/javac启动器将
-p
转换为
--模块路径
,并将选项和值之间的空格转换为
=
。最初的模块很复杂,java launcher将
-m
-module
转换为
-Djdk.module.main=
,我已经忘记了这一点。_java_launcher_DEBUG是env变量(在我之前的评论中输入错误)。Java11似乎抱怨--module path“和--add modules”参数。此代码在再次运行Java11时失败