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

Ubuntu 18.04/20.04下C/C++调用Java函数遇JNI_CreateJavaVM未定义引用错误

解决JNI编译时"undefined reference to 'JNI_CreateJavaVM'"错误

核心问题分析

这个错误是链接阶段无法找到JNI_CreateJavaVM符号,该符号定义在JVM的动态库libjvm.so中,通常是编译命令的库顺序或路径配置问题导致的。

具体修复步骤

  1. 调整编译命令的库顺序
    GCC链接器按参数顺序处理依赖,库文件必须放在需要引用它的源文件/目标文件之后。你的原命令把-ljvm放在了CTest.cpp前面,导致链接器先处理库但还没看到需要引用的符号,修改后的命令:

    g++ -I/usr/lib/jvm/java-11-openjdk-amd64/include -I/usr/lib/jvm/java-11-openjdk-amd64/include/linux -L/usr/lib/jvm/java-11-openjdk-amd64/lib/server -L/usr/lib/jvm/java-11-openjdk-amd64/lib -L/usr/lib/jvm/java-11-openjdk-amd64/jli CTest.cpp -ljvm
    
  2. 确认libjvm.so的实际路径
    检查指定的-L路径下是否存在libjvm.so,部分系统中该文件的路径可能是$JAVA_HOME/lib/amd64/server/,可以用以下命令查找准确位置:

    find $JAVA_HOME -name libjvm.so
    

    找到后将编译命令中的-L路径替换为实际路径。

  3. 配置运行时库路径
    即使编译通过,运行程序时可能仍会找不到libjvm.so,可以通过两种方式解决:

    • 临时设置环境变量:
      export LD_LIBRARY_PATH=$JAVA_HOME/lib/server:$LD_LIBRARY_PATH
      
    • 编译时添加-rpath参数(永久嵌入运行时路径):
      g++ -I/usr/lib/jvm/java-11-openjdk-amd64/include -I/usr/lib/jvm/java-11-openjdk-amd64/include/linux -L/usr/lib/jvm/java-11-openjdk-amd64/lib/server -L/usr/lib/jvm/java-11-openjdk-amd64/lib -L/usr/lib/jvm/java-11-openjdk-amd64/jli CTest.cpp -ljvm -Wl,-rpath,$JAVA_HOME/lib/server
      
  4. 消除字符串常量转换警告
    代码中options.optionString = "-Djava.class.path=D:\\Java Src\\TestStruct";的警告是因为C++禁止将字符串常量赋值给非const的char*,修改方式:

    • 将optionString的类型改为const char*(推荐,符合C++标准)
    • 或者强制转换(不推荐,可能引发未定义行为):options.optionString = (char*)"-Djava.class.path=D:\\Java Src\\TestStruct";

内容的提问来源于stack exchange,提问作者Arjun Jv

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 10:10:23