作用:
它们都可以用来装载库文件,不论是JNI库文件还是非JNI库文件。在任何本地方法被调用之前必须先用这个两个方法之一把相应的JNI库文件装载。
其实JDK提供给用户了两个方法用于载入文件,一个是System.load(String filename)方法,另外一个是System.loadLibrary(String libname)方法。
System.load("C:\\Documents and Settings\\TestJNI.dll"); //Windows
System.loadLibrary
System.loadLibrary 参数为库文件名,不包含库文件的扩展名。
System.load(String filename)我们看JDK API的描述是“从作为动态库的本地文件系统中以指定的文件名加载代码文件。文件名参数必须是完整的路径名。”,因此这个方法的参数必须是要加载的文件的完整路径,带文件后缀名。
System.loadLibrary(String libname)我们看JDK API的描述是"加载由libname参数指定的系统库,不带后缀名。系统库指的是java.library.path,是映射到本地系统的路径。
用System.getProperty(String key)方法查看一下java.library.path指向的内容
1
2
3
|
public static void main(String[] args){ System.out.println(System.getProperty( "java.library.path" )); } |
1
2
3
|
C:Program FilesJavajdk1. 6 .0_45in;C:WindowsSunJavain;C:Windowssystem32; C:Windows;C:Program Files (x86)Common FilesNetSarang;C:Program FilesJavajdk1. 6 .0_45in; C:Program FilesJavajdk1. 6 .0_45jrein; |
(1)先System.load("D:/B.dll")再System.load("D:/A.dll")
(2)把A.dll和B.dll都放在java.library.path下,然后调用System.loadLibrary("A")
不过两个dll文件存在依赖关系,A.dll依赖于B.dll,属于别的领域的知识,我也不是很清楚,所以第二点也没有亲身试验过。权当把这个知识点放在这儿,以后万一遇到类似问题了,也有个解决问题的方向。
在我的机器上其默认值为:
$JAVA_HOME/jre/lib/i386/server:$JAVA_HOME/jre/lib/i386
分析:
- 前三个都是JRE中提供的本地库
- 后三个是操作系统的库文件目录
-Djava.library.path 和 LD_LIBRARY_PATH的区别
如果使用 java -Djava.library.path=/jni/library/path 的方式设置的话,会覆盖默认值。其值为:
/jni/library/path
如果使用 export LD_LIBRARY_PATH=/jni/library/path的方式设置的话,会追加其值到默认值中。LD_LIBRARY_PATH的值会插入到JRE本地库之后,操作系统库文件目录之前。其值为:
$JAVA_HOME/jre/lib/i386/server:$JAVA_HOME/jre/lib/i386