此篇文章介紹在Android NDK開發中靜態庫和動態庫的知識,主要是編譯C/C++庫和呼叫C/C++庫的方法和場景。
本文第三部分是為了接下來的幾篇文章做鋪墊,也是本系列中最重要的幾篇。
本文目錄:
1.靜態庫介紹
2.動態庫介紹
3.總結靜態庫和動態庫的幾種編譯和呼叫場景
1.靜態庫介紹
靜態庫:
1.全名是靜態連結庫(Static Library),字尾是
.a
,例如libcjson.a
2.呼叫靜態庫的程式在編譯時會將靜態庫全部編譯到目的碼中,所以程式執行環境中不再需要靜態庫,並且靜態庫檔案體積較大
3.呼叫靜態庫時,如果對靜態庫中的函式內容進行改變,不僅需要重新編譯靜態庫,還需要對呼叫靜態庫的程式重新編譯,將靜態庫編譯到目的碼中。
2.動態庫介紹
動態庫:
1.全名是動態連結庫(Shared Library),字尾是
.so
,例如libcjson.so
2.呼叫動態庫的程式在編譯時不能將動態庫編譯到目的碼中,程式執行到相關函式時才會連結該動態庫對應的函式,所以程式執行環境中必須提供動態庫,並且動態庫檔案體積較小
3.呼叫動態庫時,如果對動態庫中的函式內容進行改變,只需要重新編譯動態庫,不需要對呼叫動態庫的程式重新編譯,即不需要干預目的碼,直接用新的動態庫替換掉舊的動態庫即可
3.總結靜態庫和動態庫的幾種編譯和呼叫場景
在經過多次NDK測試與驗證後,總結了靜態庫和動態庫的幾種編譯和使用場景,總體可以分為3種情況:
1.將C/C++的原始碼直接編譯成靜態庫,只能提供給底層呼叫。
注:比較適用於將第三方開源庫編譯成靜態庫,也可以將自己寫的原始碼編譯成靜態庫,給自己或其他人的底層呼叫。
2.將C/C++的原始碼直接編譯成動態庫,不需要封裝JNI層,提供給底層呼叫。
注:比較適用於將自己寫的原始碼編譯成動態庫,也可以將第三方開源庫編譯成動態庫,給自己或其他人的底層呼叫。
3.將C/C++的原始碼進行JNI層封裝後,編譯成動態庫,提供給上層呼叫。
注:比較適用於將自己寫的原始碼進行JNI封裝後,連同jar包一起,給自己或其他人的上層呼叫。
接下來的文章會詳細講解靜態庫和動態庫的編譯方法和呼叫場景。