做用:html
它们均可以用来装载库文件,不管是JNI库文件仍是非JNI库文件。在任何本地方法被调用以前必须先用这个两个方法之一把相应的JNI库文件装载。java
其实JDK提供给用户了两个方法用于载入文件,一个是System.load(String filename)方法,另一个是System.loadLibrary(String libname)方法。linux
System.loadwindows
System.load 参数必须为库文件的绝对路径,能够是任意路径,例如:
System.load("C:\\Documents and Settings\\TestJNI.dll"); //Windowseclipse
System.load("/usr/lib/TestJNI.so"); //Linux
System.loadLibrary
System.loadLibrary 参数为库文件名,不包含库文件的扩展名。spa
System.loadLibrary ("TestJNI"); //加载Windows下的TestJNI.dll本地库操作系统
System.loadLibrary ("TestJNI"); //加载Linux下的libTestJNI.so本地库.net
注意:TestJNI.dll 或 libTestJNI.so 必须是在JVM属性java.library.path所指向的路径中。code
区别:server
1.加载的路径不一样。
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 |
|
1 2 3 |
|
能够看出在window下就是classpath的路径。
2.注意事项:
假如A.dll和B.dll有依赖关系,好比A.dll静态连接到B.dll,那么若是选择System.load("D:/A.dll"),即便B.dll也放在D:/路径下,load方法仍是会由于找不到依赖的.dll文件而失败。由于Java虚拟机在载入A.dll的时候,发现它依赖于B.dll,那么会先去java.library.path下载入B.dll,而B.dll并不位于java.library.path下。有两个解决方案:
(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.library.path的路径
1.windows 下
(1): 设置classpath的路径便可,通常的动态连接库是放到c:/window/system32这个目录下。
(2): 也能够修改环境变量,增长动态连接库的地址。
(3): 开发时设置 eclipse的动态库的地址, 具体参见:
http://blog.csdn.net/ty564457881/article/details/7066423
2.linux下
须要设置系统变量LD_LIBRARY_PATH来添加java.library.path。
由于JVM启动时,会使用系统变量LD_LIBRARY_PATH的值来初始化java.library.path属性。
java.library.path默认值
在个人机器上其默认值为:
$JAVA_HOME/jre/lib/i386/server:$JAVA_HOME/jre/lib/i386
:$JAVA_HOME/jre/../lib/i386:/usr/java/packages/lib/i386:/lib:/usr/lib
分析:
- 前三个都是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
:$JAVA_HOME/jre/../lib/i386:/jni/library/path:/usr/java/packages/lib/i386:/lib:/usr/lib
转载地址:http://www.cnblogs.com/xrq730/p/4827132.html
http://blog.sina.com.cn/s/blog_48a45b9501015m6q.html