Java 8迁移至Java 11后:javac定位、jni.h查找及JNI_VERSION_10未声明问题求助
看起来你在Java版本迁移过程中遇到了两个关键问题:JNI编译报错,以及繁琐的版本切换和javac配置问题。我来一步步帮你梳理解决:
一、核心问题:JNI_VERSION_10未定义的编译错误
这个错误的根源几乎可以肯定是编译JNI代码时引用了Java 8的头文件——Java 8的jni.h中最高只定义到JNI_VERSION_8(对应JNI_VERSION_1_8),根本没有JNI_VERSION_10这个常量。
解决步骤:
先确认JAVA_HOME正确指向Java 11
先验证当前环境变量是否生效:echo $JAVA_HOME java -version javac -version输出必须显示Java 11的路径和版本号,如果不是,说明你的版本切换操作没真正生效(后面会讲更可靠的切换方式)。
编译时显式指定Java 11的头文件路径
编译JNI代码时,必须告诉编译器去Java 11的目录找头文件,比如用gcc编译的话:gcc -I$JAVA_HOME/include -I$JAVA_HOME/include/linux -c invoke.c -o invoke.o这里的
-I参数会覆盖系统默认的头文件路径,避免编译器误用到Java 8的jni.h。关于JNI版本常量的选择建议
如果你不需要严格依赖Java 10的特性,其实可以考虑使用JNI_VERSION_11(对应Java 11)或者更兼容的JNI_VERSION_1_8(Java 8及以上版本都支持)。但如果你的代码必须用JNI_VERSION_10,可以先验证Java 11的头文件是否包含这个常量:grep "JNI_VERSION_10" $JAVA_HOME/include/jni.h正常情况下,Java 11的
jni.h已经包含了这个定义。
二、优化Java版本切换方式(替代注释.bashrc)
手动注释/取消注释环境变量太繁琐,推荐在.bashrc中添加两个切换函数,一键完成版本切换:
打开
.bashrc编辑:nano ~/.bashrc添加以下内容:
# 一键切换到Java 8 function setjdk8() { export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/ export PATH=$JAVA_HOME/bin:$PATH export LD_LIBRARY_PATH=$JAVA_HOME/jre/lib:$JAVA_HOME/jre/lib/amd64:$JAVA_HOME/jre/lib/amd64/server:$LD_LIBRARY_PATH # 同步update-alternatives的默认版本 sudo update-alternatives --set java $JAVA_HOME/bin/java sudo update-alternatives --set javac $JAVA_HOME/bin/javac echo "已切换到Java 8" } # 一键切换到Java 11 function setjdk11() { export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/ export PATH=$JAVA_HOME/bin:$PATH export LD_LIBRARY_PATH=$JAVA_HOME/lib:$JAVA_HOME/lib/server:$LD_LIBRARY_PATH # 同步update-alternatives的默认版本 sudo update-alternatives --set java $JAVA_HOME/bin/java sudo update-alternatives --set javac $JAVA_HOME/bin/javac echo "已切换到Java 11" }保存后让配置生效:
source ~/.bashrc
之后你只需要输入setjdk8或setjdk11就能一键切换版本,无需手动修改配置。
三、解决javac的update-alternatives配置问题
你之前找不到javac的位置,其实Java 8和Java 11的javac都在各自JAVA_HOME/bin/目录下。如果update-alternatives里还没有javac的选项,需要先手动添加:
添加Java 8的javac:
sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-8-openjdk-amd64/bin/javac 100添加Java 11的javac:
sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-11-openjdk-amd64/bin/javac 200
(后面的数字是优先级,数字越大优先级越高,这里设置Java 11优先级更高)
添加完成后,你就可以用下面的命令切换javac版本了:
sudo update-alternatives --config javac
按照上面的步骤操作后,你的JNI编译错误应该会消失,版本切换也会更高效。如果还有问题,可以再检查编译命令中的头文件路径是否正确,或者确认Java 11的jni.h确实包含JNI_VERSION_10常量。
内容的提问来源于stack exchange,提问作者bencomo

