JNI调用静态库报错:无法找到libmylibrary.a的myFunction符号
问题解决方案
错误原因分析
你遇到的undefined symbol: myFunction错误,核心问题出在两个环节:
- 编译目标文件时未使用
-c参数,生成的是可执行文件而非纯目标文件,导致静态库符号未被正确保留; - 生成共享库时未将静态库
libmylibrary.a的内容打包进去,最终动态库缺失函数定义。
修正后的操作步骤
1. 重新编译生成目标文件
将第4步的编译命令改为(添加-c参数,仅编译不链接):
g++ -c HelloWorldJNI.cpp -L. -lmylibrary -I"/home/centos/jdk-21.0.1/include" -I"/home/centos/jdk-21.0.1/include/linux" -o HelloWorldJNI.o
-c参数确保编译器只生成目标文件,保留对myFunction的引用,为后续链接静态库做准备。
2. 正确生成包含静态库的动态库
修改第5步的命令,将静态库libmylibrary.a直接参与链接,把其内容打包进动态库:
g++ -shared -o native.dll HelloWorldJNI.o libmylibrary.a -I"/home/centos/jdk-21.0.1/include" -I"/home/centos/jdk-21.0.1/include/linux"
也可以用-L. -lmylibrary的方式,但要保证目标文件在前、静态库在后:
g++ -shared -o native.dll HelloWorldJNI.o -L. -lmylibrary
额外注意事项
- 如果
libmylibrary.a是C语言编写的静态库,需在JNI代码的头文件引用处添加extern "C"包裹,避免C++名字修饰导致符号不匹配:
extern "C" { #include "mylibrary.h" }
- Linux系统下动态库标准后缀是
.so,建议将native.dll改为libnative.so,Java代码中可改用System.loadLibrary("native")加载(需设置java.library.path指向库所在目录)。
内容的提问来源于stack exchange,提问作者Roohein Malhotra
相关产品推荐
相关产品推荐

