使用JAVA调用动态链接库(.so)是很常见的操作,JAVA提供了JNA和JNI两种方式进行调用,通常通过System.loadLibrary("xxx") 来加载库文件,非常方便。但在实际使用中,经常遇到UnsatisfiedLinkError的问题,此类问题通常有两个原因:
- 32位JDK调用64位库或64位JDK调用32位库。
- 路径问题。
第一个问题,动态链接库(.so)是有32位和64位的区别的,我们选择JDK时,一定要与动态链接库相匹配,不能错配。
第二个问题,需要关注两个地方:
1.正确命名库文件。
当使用System.loadLibrary("xxx") 来加载库文件,在linux下,库文件的名称必须是:libxxx.so,也就是说在xxx前面要加lib前缀,这个是必须的,而且大小写敏感。
2.告诉jvm到那里去找这个库文件。
需要设置 java.library.path 参数,加入so文件所在路径。在启动脚本中,可以通过java -Djava.library.path=/home/sw/pathtoso 的方式设置,其中/home/sw/pathtoso 是库文件所在目录。很多文章提到需要设置linux中的LD_LIBRARY_PATH变量,我尝试过,无效。所以正确设置 java.library.path 参数才是正解。
参考链接: