Eclipse中JNI调用C++ std::string时报UnsatisfiedLinkError找不到依赖库
问题根因
你遇到的报错和头文件无关,头文件仅保证编译阶段通过,运行阶段报错是因为你的C动态库依赖C标准运行时库,系统无法找到对应的库文件:
- 不使用
std::string时,你的代码没有触发对C++标准库的依赖,动态库仅依赖基础系统组件,因此可以正常加载 - 使用
std::string后,动态库新增了对C++标准运行时库的依赖,缺少该文件就会触发Can't find dependent libraries错误
解决方案
根据你使用的编译器不同,对应操作如下:
如果你使用MinGW编译(你的dll命名为libnative_cpp.dll,大概率为该情况)
方案1:静态链接C++标准库(最推荐)
将C++标准库直接打包进你的动态库,不需要额外携带依赖文件:
- 打开Eclipse的C++项目构建设置,找到
MinGW C++ Linker->Miscellaneous选项 - 在
Linker flags中添加参数:-static-libstdc++ -static-libgcc - 重新编译生成动态库即可
方案2:补齐依赖库
- 找到MinGW安装目录下的
bin文件夹,复制libstdc++-6.dll、libgcc_s_seh-1.dll(64位)或libgcc_s_dw2-1.dll(32位)到你的libnative_cpp.dll同目录 - 或者将MinGW的
bin目录添加到系统环境变量PATH中,重启Java运行环境生效
如果你使用MSVC编译
方案1:静态链接运行时
- 打开Visual Studio项目属性,依次进入
C/C++->代码生成 - Debug版将运行库改为
多线程调试(/MTd),Release版改为多线程(/MT) - 重新编译生成动态库即可
方案2:补齐依赖库
- 安装对应版本的VC++可再发行组件包,或者将编译环境下的
vcruntimexxx.dll、msvcpxxx.dll复制到动态库同目录
验证方法
你可以使用dumpbin /dependents libnative_cpp.dll命令,或者Dependency Walker工具查看动态库的所有依赖项,确认缺少的库文件后补齐即可。
注意:不要将Debug版的动态库用于分发,Debug版的标准库依赖仅在安装了对应编译器的设备上存在,正式使用请编译Release版。
内容的提问来源于stack exchange,提问作者Auro
相关产品推荐
相关产品推荐

