You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java 8迁移至Java 11后:javac定位、jni.h查找及JNI_VERSION_10未声明问题求助

解决Java 8→11迁移中的JNI版本错误与版本切换问题

看起来你在Java版本迁移过程中遇到了两个关键问题:JNI编译报错,以及繁琐的版本切换和javac配置问题。我来一步步帮你梳理解决:


一、核心问题:JNI_VERSION_10未定义的编译错误

这个错误的根源几乎可以肯定是编译JNI代码时引用了Java 8的头文件——Java 8的jni.h中最高只定义到JNI_VERSION_8(对应JNI_VERSION_1_8),根本没有JNI_VERSION_10这个常量。

解决步骤:

  1. 先确认JAVA_HOME正确指向Java 11
    先验证当前环境变量是否生效:

    echo $JAVA_HOME
    java -version
    javac -version
    

    输出必须显示Java 11的路径和版本号,如果不是,说明你的版本切换操作没真正生效(后面会讲更可靠的切换方式)。

  2. 编译时显式指定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。

  3. 关于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中添加两个切换函数,一键完成版本切换:

  1. 打开.bashrc编辑:

    nano ~/.bashrc
    
  2. 添加以下内容:

    # 一键切换到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"
    }
    
  3. 保存后让配置生效:

    source ~/.bashrc
    

之后你只需要输入setjdk8或setjdk11就能一键切换版本,无需手动修改配置。


三、解决javac的update-alternatives配置问题

你之前找不到javac的位置,其实Java 8和Java 11的javac都在各自JAVA_HOME/bin/目录下。如果update-alternatives里还没有javac的选项,需要先手动添加:

  1. 添加Java 8的javac:

    sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-8-openjdk-amd64/bin/javac 100
    
  2. 添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 19:18:10