Nat*_*teW 5 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。
因此,由于某种原因,我的可执行文件似乎仍指向libjvm.so的Java 1.6版本,这可能是我的makefile中的一个问题。我将自行调试。
对于stackoverflow的人们来说,真正的问题是“ JavaVMInitArgs.version到底意味着什么?”
我假设JNI版本与Java版本相对应(因此JNI_VERSION_1_8与JRE8某种程度上相关),但我不清楚它究竟如何影响加载的内容或如何使用它。
我的想法是,您指定的版本可能指示运行程序所需的Java的最低版本,因此,如果指定JNI_VERSION_1_X,则只要Y> = X,就可以加载任何与Java Y兼容的JVM?
而且,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值到底是什么意思。
JNI_VERSION
指定接口的版本JNI
。对于给定版本,JNI API 可能与其他版本略有不同。
例子:
\n\n#ifdef JNI_VERSION_1_1\n JDK1_1InitArgs vm_args;\n ...\n ...\n#else \n JavaVMInitArgs vm_args; \n ...\n ...\n#endif /* JNI_VERSION_1_1 */ \n
Run Code Online (Sandbox Code Playgroud)\n\n来源:Java\xe2\x84\xa2 本机接口:Programmer\xe2\x80\x99s 指南和规范,The
\n\n您可以使用以下方法获取库(您正在链接的)支持的版本号: https: //docs.oracle.com/javase/9/docs/specs/jni/functions.html#getversion
\n\n您还可以查找JNI
给定 JDK 版本的内部接口增强功能:
https://www.oracle.com/technetwork/java/javase/13all-relnotes-5461743.html
\n 归档时间: |
|
查看次数: |
450 次 |
最近记录: |