我正在尝试通过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值究竟是什么意思。
答案 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