Linux下Java加载JNI本地库失败:库存在却无法找到
针对你遇到的UnsatisfiedLinkError问题——即使java.library.path路径正确仍找不到库,按以下步骤逐一排查:
检查本地库命名是否符合Linux规范
Linux下JNI库必须遵循lib{库名}.so的命名格式,比如你调用System.loadLibrary("native"),对应的库文件必须是libnative.so,而非native.so。前往/home/usr/FSVRPpd/lib目录确认文件名,若不符,可重命名文件或编译时指定输出名为libnative.so。验证库文件及父目录权限
Java进程需要对库文件有读和执行权限,对父目录有执行权限(才能进入目录访问文件):- 查看库文件权限:
ls -l /home/usr/FSVRPpd/lib/libnative.so,确保权限包含r-x(例如-rwxr-xr-x),若权限不足,执行chmod +rx /home/usr/FSVRPpd/lib/libnative.so。 - 查看父目录权限:
ls -ld /home/usr/FSVRPpd/lib,确保权限包含x(例如drwxr-xr-x),若不足,执行chmod +x /home/usr/FSVRPpd/lib。
- 查看库文件权限:
检查库文件的依赖完整性
本地库可能依赖其他系统库或CPLEX库,用ldd /home/usr/FSVRPpd/lib/libnative.so命令查看依赖项,若出现not found的条目,说明依赖库缺失或路径未配置:- 若缺失CPLEX相关库,确认
LD_LIBRARY_PATH是否包含CPLEX的库路径,或编译时是否正确链接了CPLEX库。 - 若缺失系统库,安装对应的系统包(比如
libc6-dev等,根据缺失库名判断)。
- 若缺失CPLEX相关库,确认
验证Java与库的架构匹配
确保Java的运行架构与本地库的编译架构一致:- 查看Java架构:
java -version,输出中会显示x86_64(64位)或i386(32位)。 - 查看库架构:
file /home/usr/FSVRPpd/lib/libnative.so,输出中会显示ELF 64-bit LSB shared object或32-bit,需与Java架构完全匹配。
- 查看Java架构:
用绝对路径直接加载测试
暂时替换System.loadLibrary("native")为System.load("/home/usr/FSVRPpd/lib/libnative.so"),运行代码看是否能加载成功:- 若成功:说明是路径解析的问题,检查
java.library.path的配置是否有隐藏问题(比如路径包含特殊字符、空格等)。 - 若仍失败:说明库本身存在问题(依赖、权限、架构等),回到前面的步骤重新排查。
- 若成功:说明是路径解析的问题,检查
正确配置LD_LIBRARY_PATH
若依赖其他库(比如CPLEX),需确保LD_LIBRARY_PATH包含所有依赖库的路径,且设置方式正确:
执行命令时先导出环境变量再运行Java:export LD_LIBRARY_PATH="/home/usr/ILOG/CPLEX_Studio1210/cplex/bin/x86-64_linux:/home/usr/FSVRPpd/lib" java -cp ./target/FSVRPpd-1.0.jar -Xmx15g fvrpsd.test.FSVRPpdTest注意:
LD_LIBRARY_PATH是Linux系统加载共享库的路径,-Djava.library.path是Java查找JNI库的路径,两者的配置都可能影响库的加载结果。
内容的提问来源于stack exchange,提问作者Student NL

