System.load 與 System.loadLibrary 的區別


相同點

它們都可以用來裝載庫文件,不論是JNI庫文件還是非JNI庫文件。

在任何本地方法被調用之前必須先用這個兩個方法之一把相應的JNI庫文件裝載。


System.load
System.load 參數必須為庫文件的絕對路徑,可以是任意路徑,例如:
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而失敗。
因為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包含的路徑中即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM