JNI开发遇UnsatisfiedLinkError:库存在且路径正确仍报错
你遇到的问题是:本地库libMyNativeLib.so存在,路径已加入LD_LIBRARY_PATH且java.library.path包含该路径,但运行java -jar MyTest.jar时仍报错找不到库,异常信息如下:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no libMyNativeLib.so in java.library.path: /usr/local/src/MyProject/lib:/usr/java/packages/lib:/usr/lib/x86_64-linux-gnu/jni:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu:/usr/lib/jni:/lib:/usr/lib
at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2429)
at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:818)
at java.base/java.lang.System.loadLibrary(System.java:1989)
at MyTest.main(MyTest.java:37)
核心加载代码:
public class AJniClass { static { System.loadLibrary("MyNativeLib"); } }
库文件路径:/usr/local/src/MyProject/lib/libMyNativeLib.so
以下是具体排查思路和解决办法:
检查库与JVM的架构兼容性
用file命令查看库的架构:file /usr/local/src/MyProject/lib/libMyNativeLib.so再用
java -version查看JVM的架构(比如64-Bit Server VM),两者必须完全匹配。32位JVM无法加载64位库,反之亦然。排查库的依赖缺失
用ldd命令检查库的依赖项,看是否有缺失的系统库:ldd /usr/local/src/MyProject/lib/libMyNativeLib.so如果输出中有
not found的项,需要安装对应的依赖包,或者将缺失库所在路径添加到LD_LIBRARY_PATH中。强制在运行命令中指定LD_LIBRARY_PATH
有时环境变量的设置可能未在Java进程中生效,直接在运行命令前指定:LD_LIBRARY_PATH=/usr/local/src/MyProject/lib java -jar MyTest.jar强制让当前Java进程优先加载该路径下的库。
检查库及目录的访问权限
确保Java进程拥有读取库文件和访问目录的权限:# 给目录添加执行权限(允许进入目录) chmod +x /usr/local/src/MyProject/lib # 给库文件添加读取权限 chmod +r /usr/local/src/MyProject/lib/libMyNativeLib.so如果用非root用户运行Java,还要确认该用户对整个路径有访问权限。
尝试用绝对路径直接加载库
修改加载代码,跳过路径查找逻辑,直接指定库的绝对路径:public class AJniClass { static { System.load("/usr/local/src/MyProject/lib/libMyNativeLib.so"); } }如果能成功加载,说明是路径查找逻辑的问题;如果仍报错,说明库本身存在问题(如依赖、架构不兼容)。
确认JDK版本兼容性
检查编译JNI库时使用的JDK版本,与运行MyTest.jar的JDK版本是否一致。比如用JDK 8编译的库在JDK 11环境下可能出现兼容性问题,尽量保持版本一致。
内容的提问来源于stack exchange,提问作者Dan Parker

