JavaVMInitArgs.version究竟意味着什么?

时间:2016-07-14 19:43:37

标签: java-native-interface

我正在尝试通过JNI从C ++加载jvm,我原本无意识地将我的JavaVMInitArgs.version设置为" JNI_VERSION_1_6"不知道它意味着什么。

后来,我安装了java 8,修改了我的makefile以链接新的libjvm.so并包含新的jni.h,并将我的版本更改为" JNI_VERSION_1_8"现在我对JNI_CreateJavaVM的调用返回-3(JNI_EVERSION)。

我切换回JNI_VERSION_1_6并且装好了。我检查了我的JNIEnv对象的版本号,看到它仍然说1.6。出于好奇,我再次尝试使用JNI_VERSION_1_4,发现它不仅装得很好,而且版本仍为1.6。

因此,由于某些原因,我的可执行文件似乎仍然指向java 1.6版本的libjvm.so,这可能是我的一个makefile的一些问题。我将自己调试它。

我对stackoverflow的人有一个真正的问题是#34; JavaVMInitArgs.version到底是什么意思呢?"

我假设JNI版本与java版本相对应(因此JNI_VERSION_1_8与JRE8有某种关系)但我并不清楚它究竟会如何影响加载的内容或如何使用它

我的想法是,您指定的版本可能表示运行程序所需的最低Java版本,因此如果指定JNI_VERSION_1_X,则只要Y> = =,就可以加载与Java Y兼容的任何JVM。 X?

此外,JNI版本是否只规定了C ++与Java代码交互所需的版本,还是它决定了Java代码本身的版本?换句话说,假设我的Java代码做了一些需要Java 7的东西,但是我的C ++代码与之隔离并只调用Java 4兼容的东西,那么我可以将我的JNI版本设置为1_4并将我的程序与Java7版本链接libjvm.so?

我意识到我曾经问过很多问题,但是如果有人能给我一个关于它是如何工作的描述,我将非常感激。当然,如果有人知道为什么我似乎无法加载Java8,我也很乐意听取你的建议。

修改

我弄清楚为什么我似乎无法在Java 8版本的libjni.so中正确链接。我在makefile中正确地将新库添加到我的-L g ++参数中,但是我的环境变量LD_LIBRARY_PATH(显然g ++先检查)仍指向旧的libjni.so。我将LD_LIBRARY_PATH设置为指向正确的库(我可能也刚刚删除它),现在它工作得很好。

我仍然有兴趣知道JNI_VERSION值究竟是什么意思。

1 个答案:

答案 0 :(得分:0)

JNI_VERSION指定JNI界面的版本。对于给定的版本,JNI API可能与其他版本略有不同。

示例:

#ifdef JNI_VERSION_1_1
  JDK1_1InitArgs vm_args;
  ...
  ...
#else 
  JavaVMInitArgs vm_args; 
  ...
  ...
#endif /* JNI_VERSION_1_1 */ 

来源:Java™ Native Interface: Programmer’s Guide and Specification, The

您可以使用https://docs.oracle.com/javase/9/docs/specs/jni/functions.html#getversion

获得库(您要链接到的)支持的版本号。

对于给定的JDK版本,您还可以在JNI界面中寻找增强功能:

https://www.oracle.com/technetwork/java/javase/13all-relnotes-5461743.html