Java调用本地方法时无法找到SensorReader.so库的问题求助
我碰到过很多开发者遇到JNI库加载的这类问题,咱们一步步来排查解决:
1. 先确认库文件的命名是否符合规则
Linux系统下的JNI库有固定命名要求:必须是lib<你要加载的名字>.so。所以你代码里写的System.loadLibrary("SensorReader"),对应的库文件必须是libSensorReader.so,不能是SensorReader.so或者其他名字。先检查你的库文件名是不是错了,这是最常见的小坑。
2. 核对库的架构和JVM是否匹配
从你的java.library.path里的/usr/java/packages/lib/arm能看出来,你的系统是ARM架构的。那你编译出来的.so库必须也是ARM架构的,不能是x86或者其他架构的。可以用这个命令检查:
file libSensorReader.so
输出内容里得有ARM相关的标识,如果是其他架构,那肯定加载不了,得重新编译对应ARM版本的库。
3. 检查库文件的权限和可访问性
JVM得能读得到你的库才行。先看一下权限:
ls -l libSensorReader.so
如果权限里没有r(可读),就执行chmod +r libSensorReader.so给它加上读权限。另外,有些ARM系统的/lib或者/usr/lib下面还有子目录(比如/lib/arm-linux-gnueabihf/),你得确认把库放到了正确的子目录里,而不是只放到父目录。
4. 用更可靠的方式指定库路径
有时候临时导出环境变量可能没生效,试试这些方法:
- 启动Java时直接指定路径:运行Java命令的时候加上
-Djava.library.path参数,比如你的库在当前目录,就这么运行:
这个参数的优先级比系统环境变量高,能确保JVM优先搜索你指定的路径。java -Djava.library.path=. YourMainClass - 正确设置LD_LIBRARY_PATH:临时生效的话,在运行Java前先执行:
如果想永久生效,就把这行加到export LD_LIBRARY_PATH=/path/to/your/library:$LD_LIBRARY_PATH java YourMainClass~/.bashrc或者/etc/profile里,然后执行source ~/.bashrc让它生效。 - 放到JVM默认的ARM专属目录:你的
java.library.path里有/usr/java/packages/lib/arm,把libSensorReader.so复制到这个目录下,然后重启JVM试试,这个目录是JVM专门为ARM架构预留的搜索路径。
5. 检查库的依赖是否完整
有时候不是找不到你的库,而是你的库依赖的其他系统库缺失了。用这个命令查看依赖:
ldd libSensorReader.so
如果输出里有not found的项,那得先安装对应的依赖库,你的库才能被JVM正确加载。
6. 用绝对路径加载做测试
如果上面的方法都不行,试试直接用绝对路径加载库,比如:
System.load("/home/yourname/libs/libSensorReader.so");
把路径换成你的库的实际绝对路径,这样能先排除路径配置的问题,确认库本身是可以被加载的。
内容的提问来源于stack exchange,提问作者Andrea de'Rose

