Ubuntu 18.04/20.04下C/C++调用Java函数遇JNI_CreateJavaVM未定义引用错误
解决JNI编译时"undefined reference to 'JNI_CreateJavaVM'"错误
核心问题分析
这个错误是链接阶段无法找到JNI_CreateJavaVM符号,该符号定义在JVM的动态库libjvm.so中,通常是编译命令的库顺序或路径配置问题导致的。
具体修复步骤
调整编译命令的库顺序
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确认
libjvm.so的实际路径
检查指定的-L路径下是否存在libjvm.so,部分系统中该文件的路径可能是$JAVA_HOME/lib/amd64/server/,可以用以下命令查找准确位置:find $JAVA_HOME -name libjvm.so找到后将编译命令中的
-L路径替换为实际路径。配置运行时库路径
即使编译通过,运行程序时可能仍会找不到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
- 临时设置环境变量:
消除字符串常量转换警告
代码中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
相关产品推荐
相关产品推荐

