C++ 中的模块路径到 Java JNI 调用

2024-05-06

当我用 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 9 JVM 模块路径呢?没有 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 时它失败了。我想这是因为它不支持我尝试的选项。


这是一个较晚的答案,但搜索此问题的人可能会发现它很有用。不幸的是,解决这种情况的文档确实很少。 我花了一些时间来研究这个问题,并找到了一种让它发挥作用的方法。以下是要采取的步骤。

  • 使用 JDK 提供的“jlink”工具将应用程序包捆绑在自定义 JRE 中:https://docs.oracle.com/en/java/javase/11/tools/jlink.html https://docs.oracle.com/en/java/javase/11/tools/jlink.html
  • 使用类加载器找到您的主类。要在 JNI 中执行此操作,您可以使用“FindClass()”函数:https://docs.oracle.com/en/java/javase/11/docs/specs/jni/functions.html#findclass https://docs.oracle.com/en/java/javase/11/docs/specs/jni/functions.html#findclass

第一步删除了定义 JNI 不支持的“--module-path”标志的要求。请注意,要正确捆绑您的应用程序,所有 jar 都必须转换为模块化 jar。第三方 jar 可能不是真正的模块化 jar,而是自动模块,但 jlink 不支持自动模块(将 jlink 与自动模块一起使用 https://stackoverflow.com/questions/52518105/using-jlink-with-automatic-modules)。幸运的是,这里记录了一种自动执行此操作的方法:在java 9中使用jdeps为自动模块创建模块信息 https://stackoverflow.com/questions/47727869/creating-module-info-for-automatic-modules-with-jdeps-in-java-9

即使您的类位于模块内,第二步仍然有效。请注意,类“p1.p2.p3.MyClass”的类名参数必须是“p1/p2/p3/MyClass”。我提到这一点是因为由于约定的这种差异我浪费了一些时间。

如果我能找到一些时间,我可能会发布一个示例,但这可能不会在短时间内发生。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 中的模块路径到 Java JNI 调用 的相关文章

随机推荐