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

JNI调用含json.hpp的C++库时出现UnsatisfiedLinkError问题求助

解决JNI动态库依赖nlohmann/json时的UnsatisfiedLinkError问题

你遇到的问题核心是Mingw编译的动态库依赖了系统中找不到的C++标准库DLL——虽然nlohmann/json是单头文件库,但用g++编译时,编译器默认会引入标准库的动态链接版本,而Java运行环境找不到这些依赖库。下面是具体的解决步骤:

1. 修正编译命令

你的编译命令有两个需要调整的点:

  • 不需要把json.hpp作为编译输入参数(它是头文件,仅需在cpp中include即可)
  • 缺少静态链接C++标准库的参数,导致生成的dll依赖Mingw的动态库文件

修改后的编译命令如下:

x86_64-w64-mingw32-g++ -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" -shared -o hello.dll HelloJNI.cpp -static-libstdc++ -static-libgcc

添加-static-libstdc++和-static-libgcc参数后,编译器会把C++标准库和GCC运行时库静态链接到你的dll中,生成的hello.dll就不再依赖外部的Mingw DLL文件了。

2. 确认nlohmann/json的使用方式

你当前的代码写法(#include "json.hpp" + using json = nlohmann::json;)是完全正确的,nlohmann/json默认是header-only模式,不需要额外链接其他库,这一步没有问题。

3. 验证动态库依赖(可选)

你可以用Windows自带的dumpbin工具再次检查hello.dll的依赖,确认静态链接是否成功:

dumpbin /dependents hello.dll

如果输出里不再包含Mingw相关的DLL(比如libstdc++-6.dll、libgcc_s_seh-1.dll),说明静态链接已经生效。

4. 确保Java能正确加载dll

把生成的hello.dll放在Java项目的根目录下,或者添加到系统的PATH环境变量中,保证System.loadLibrary("hello")能找到并加载它。

按照以上步骤修改后,应该就能解决UnsatisfiedLinkError的问题了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:57:39