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

JNI调用静态库报错:无法找到libmylibrary.a的myFunction符号

问题解决方案

错误原因分析

你遇到的undefined symbol: myFunction错误,核心问题出在两个环节:

  1. 编译目标文件时未使用-c参数,生成的是可执行文件而非纯目标文件,导致静态库符号未被正确保留;
  2. 生成共享库时未将静态库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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 03:23:12