此篇文章介紹在Android NDK開發中靜態庫和動態庫的知識,主要是編譯C/C++庫和調用C/C++庫的方法和場景。json
本文第三部分是爲了接下來的幾篇文章作鋪墊,也是本系列中最重要的幾篇。函數
本文目錄:測試
1.靜態庫介紹code
2.動態庫介紹開發
3.總結靜態庫和動態庫的幾種編譯和調用場景源碼
靜態庫:編譯
1.全名是靜態連接庫(Static Library),後綴是
.a
,例如libcjson.a
class2.調用靜態庫的程序在編譯時會將靜態庫所有編譯到目標代碼中,因此程序運行環境中再也不須要靜態庫,而且靜態庫文件體積較大程序
3.調用靜態庫時,若是對靜態庫中的函數內容進行改變,不只須要從新編譯靜態庫,還須要對調用靜態庫的程序從新編譯,將靜態庫編譯到目標代碼中。方法
動態庫:
1.全名是動態連接庫(Shared Library),後綴是
.so
,例如libcjson.so
2.調用動態庫的程序在編譯時不能將動態庫編譯到目標代碼中,程序執行到相關函數時纔會連接該動態庫對應的函數,因此程序運行環境中必須提供動態庫,而且動態庫文件體積較小
3.調用動態庫時,若是對動態庫中的函數內容進行改變,只須要從新編譯動態庫,不須要對調用動態庫的程序從新編譯,即不須要干預目標代碼,直接用新的動態庫替換掉舊的動態庫便可
在通過屢次NDK測試與驗證後,總結了靜態庫和動態庫的幾種編譯和使用場景,整體能夠分爲3種狀況:
1.將C/C++的源碼直接編譯成靜態庫,只能提供給底層調用。
注:比較適用於將第三方開源庫編譯成靜態庫,也能夠將本身寫的源碼編譯成靜態庫,給本身或其餘人的底層調用。
2.將C/C++的源碼直接編譯成動態庫,不須要封裝JNI層,提供給底層調用。
注:比較適用於將本身寫的源碼編譯成動態庫,也能夠將第三方開源庫編譯成動態庫,給本身或其餘人的底層調用。
3.將C/C++的源碼進行JNI層封裝後,編譯成動態庫,提供給上層調用。
注:比較適用於將本身寫的源碼進行JNI封裝後,連同jar包一塊兒,給本身或其餘人的上層調用。
接下來的文章會詳細講解靜態庫和動態庫的編譯方法和調用場景。