Linux平台和Windows平台下Web Service加载JNI dll的区别
Web Service是由Java编写,部署在Tomcat上。 Web Service调用JNI DLL之前,需要加载该DLL,在生成WAR包的java工程中,可以使用“System.load()” 来加载外部DLL,但是必须写全路径,这样不利于跨平台。也可以使用函数"System.loadLibrary()"来加载外部DLL,只需要写文件名(省略后缀名)。如果找不到库,就会弹出 异常UnsatisfiedLinkError no *** in java.library.path
System.loadLibrary()函数在windows和linux平台下对库的查找有区别。
在Windows平台下,供Web Service调用的JNI DLL 为"JNI_KindleService.dll" , 假设该DLL位于 d:\Test\目录下。在将“JNI_KindleService.dll" 拷贝到系统环境变量PATH下的任何一个目录下,或者将“d:\Test\”追加到PATH环境变量里,然后就可以使 System.loadLibrary("JNI_KindleService"); 加载该DLL,JDK会依次在PATH环境变量设置的各个目录下,依次查找后缀名为.dll,且文件名为JNI_KindleService的库,直到找到为止。
如果在Linux平台下,该DLL名称为 "libJNI_KindleService.so", 位于/home/lib目录下,
仍然使用 System.loadLibrary("JNI_KindleService"); 来加载该DLL
在Linux下,系统会将System.loadLibrary()传入的文件名参数,补上前缀"lib",后缀名".so",然后在环境变量LD_LIBRARY_PATH里面设置的路径里,依次查找文件 "libJNI_KindleService.so" 直到在某个目录下能找到该文件为止。
可以在/etc/profile 内使用
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/lib
来将该DLL所在目录添加查找库的环境变量上
使用source /etc/profile 让该变量对当前的shell生效
可以使用
echo $LD_LIBRARY_PATH
查看变量结果