【NDK】【004】動態庫管理,dll加載原理

這篇博客我們主要講解,Java程序是如何查找dll的
根據這個查找規則,我們又該如何去管理dll文件,如何修改軟件運行參數

Java程序會從哪些地方查找dll文件

  • 當前運行目錄:默認爲jar包所在目錄,或工程代碼所在根目錄
  • 操作系統的path環境變量:path變量中包括的所有位置都會被查找,我們平時配JDK時,就會用到這個路徑,其實就是把JDK中的類庫共享給所有Java程序
  • 工程私有的path環境變量:IntelliJ Idea允許我們臨時修改環境變量,但是隻對當前工程代碼生效,對其它工程和程序沒有影響,也不會改變操作系統中的配置
  • 程序的庫目錄:不管是IntelliJ Idea還是Jar包,我們都可以通過Djava.library.path參數來指定dll/so庫的查找位置

修改IntelliJ Idea的運行目錄和環境變量

通過Run - Edit Configurations可以配置當前工程的運行目錄和私有的path環境變量
除了運行目錄和環境變量,我們還看到一個VM options,這個相當於jar包啓動時的附加參數,比如-Djava.library.path,-Xms,-Xmx等選項,都可以在這裏配置
在這裏插入圖片描述
我們將運行目錄和環境變量都設置爲C盤根目錄
再將dll移動到C盤根目錄,程序正常運行,說明參數修改生效
在這裏插入圖片描述

修改Jar包的庫目錄

由於Jar包本身就是一個可執行程序,所以它的運行目錄就是它自己所在的目錄,是不可能修改的

Jar包的庫目錄可以通過-Djava.library.path參數來指定
以-D開頭的參數在Java代碼中可以通過System.getProperty方法來獲取

我們將代碼打包爲Jar包,通過-D參數來指定dll的庫目錄爲lib文件夾
Jar包正常運行,說明方法有效

java -jar -Djava.library.path=./lib a.jar

在這裏插入圖片描述

利用這個原理,我們可以做哪些事情

  • 快速部署。在沒有修改過運行目錄的情況下,直接把dll扔到jar包同級目錄,就可以直接使用了
  • 文件分類管理。在Jar包同級目錄新建一個library文件夾,將其設置爲庫目錄,將所有dll都放入此文件夾,就可以達到對庫文件進行統一管理的目的。如果有多個jar包,還可以有多個庫目錄,這樣可以對程序文件進行科學管理
  • 修復丟失的庫文件。由於操作系統中的path環境變量一般都會包括system32,jdk等文件夾,所以我們只要把dll扔到這些目錄下面,就可以被所有的軟件共享。這種操作方式我們在Windows軟件中也經常見到,一般我們系統缺少某某文件,百度就會告訴我們,下載xxx放入c:/windows/system32下面就行了
  • 建立共享庫。我們可以指定一個固定目錄,然後公司所有產品都以它作爲庫目錄,這樣就達到了資源共享目的。這種方式比較適合大公司,一來大公司組件化做得比較好,組件較多,二來有些組件體積比較大,如果每個軟件都帶一份,會浪費很多磁盤空間,三來也只有大公司纔可能同時在客戶的機子上安裝多套軟件。比如微軟的程序,就是很典型的這種模式,很多程序之間是相互依賴的,安裝一套軟件前,經常需要先安裝其它組件。不過由於微軟的產品實在太多,版本也多,早期沒有科學地進行長遠規劃,從而引發了一系列的負面效果,比如軟件無法卸載乾淨,版本衝突等問題,有時只能重裝系統才能解決。畢竟共享組件容易,但是組件要更新,其它產品也要更新,還要保證一份組件兼容所有產品的所有版本,實在是有點難
  • 搭建私人代碼倉庫。同樣的道理,我們將自己常用的庫文件放到一個固定位置,再把這個目錄加入到操作系統的path環境變量中,以後其它工程就可以直接使用了,好比我們使用Maven一樣
  • 修復編程環境。以上簡單介紹了環境變量的幾種應用情景,不過最大的收穫還是在於,我們弄清了運行目錄和環境變量的作用後,就知道如何去查看和修改它們,以後再遇到動態庫找不到的問題,就可以思路清楚,輕輕鬆鬆地解決了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章