做用: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