相同點
它們都可以用來裝載庫文件,不論是JNI庫文件還是非JNI庫文件。
在任何本地方法被調用之前必須先用這個兩個方法之一把相應的JNI庫文件裝載。
System.load
System.load 參數必須為庫文件的絕對路徑,可以是任意路徑,例如:
System.load("C:\\Documents and Settings\\TestJNI.dll"); //Windows
System.load("C:\\Documents and Settings\\TestJNI.dll"); //Windows
System.load("/usr/lib/TestJNI.so"); //Linux
System.loadLibrary
System.loadLibrary 參數為庫文件名,不包含庫文件的擴展名。
System.loadLibrary ("TestJNI"); //加載Windows下的TestJNI.dll本地庫
System.loadLibrary ("TestJNI"); //加載Linux下的libTestJNI.so本地庫
注意:
TestJNI.dll 或 libTestJNI.so 必須是在JVM屬性java.library.path所指向的路徑中。
本地庫的依賴庫
如果你要載入的庫文件靜態鏈接到其它動態鏈接庫,如TestJNI.dll 靜態鏈接到dependency.dll,必須注意:
1)如果你選擇System.load("D:\\lib\\TestJNI.dll");
那么即使你把dependency.dll同樣放在D:\\lib下,load還是會因為找不到依賴的dll而失敗。
1)如果你選擇System.load("D:\\lib\\TestJNI.dll");
那么即使你把dependency.dll同樣放在D:\\lib下,load還是會因為找不到依賴的dll而失敗。
因為jvm在載入TestJNI.dll會先去載入TestJNI.dll所依賴的庫文件dependency.dll,而dependency.dll並不位於java.library.path所指定的目錄下,所以jvm找不到dependency.dll。
你有兩個方法解決這個問題:
你有兩個方法解決這個問題:
一是把D:\\lib加入到java.library.path的路徑中。
二是先調用System.load("D:\\lib\\dependency.dll"); 讓jvm先載入dependency.dll,
然后再調用System.load("D:\\lib\\TestJNI.dll");
2)如果你選擇System. loadLibrary ("TestJNI");
那么你只要把dependency.dll放在任何java.library.path包含的路徑中即可。