Android NDK祕籍--淺析靜態庫和動態庫

一隻斑馬在搬碼發表於2019-04-07

此篇文章介紹在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包一起,給自己或其他人的上層呼叫。

接下來的文章會詳細講解靜態庫和動態庫的編譯方法和呼叫場景。

相關文章