最近在编译Spatialite,查看Akka的ZeroMQ的demo程序是,容易出现
java.lang.UnsatisfiedLinkError: Unable to load library错误。由于相关的Jar调用了native方法,但是相关的dll或者是so组件没有进行注册,导致失败。下面根据上网资料归纳了一下在Windows平台下解决思路(以下方法均未实测):
java中
载入库文件有两个函数,
System.load
和
System.loadLibrary
。
当使用
System.load
时,需要输入文件的全路径,例如:
System.load(“/tmp/test.so”);
当使用
System.loadlibrary
时是在系统的
library
的目录中需找复合条件的库文件,可以使用
-Djava.library.path
=[path]
参数,来指定
Java
程序加载库文件的路径,或者将库文件(
*.so,*.dll
)复制到
include
的默认路径,
Linux
一般是
/usr/lib
目录下,当然你可以编辑/etc/ld.so.conf.d/下的文件,设定自己的库查找路径ldconfig -v|grep xxx看看有没有你的动态库。
Linux
还要注意,使用
System.loadLibrary(
name
)
方法其中参数内容与
Windows
有区别,
Linux
中的的库文件名为
lib
name
.
so
,
Windows
为
name
.dll
。
在
Windows
中尽量使用
Windows
的
C/C++
编译器生成
dll
文件,否则会出现问题。
使用regsvr32 注册dll 注册成功后就可以了。
如果不能注册,说明dll缺少依赖的dll,可以使用
Dependency Walker之类的工具查看dll依赖库,把依赖的dll找到并注册后再注册自己的dll。