Android NDK祕籍--初識NDK、JNI、Makefile/CMake

一隻斑馬在搬碼發表於2019-03-31

從此篇文章開始介紹Android NDK系列的知識。

本文目錄:

1.NDK是什麼,有何優點

2.JNI是什麼

3.Makefile和CMake是什麼,有何作用

1.NDK是什麼,有何優點

NDK(Native Development Kit):

1.NDK是原生開發工具包,這套工具允許Android使用C/C++程式碼,並提供了眾多的平臺庫。

2.Java程式碼通過Java原生介面(JNI)框架,呼叫原生庫中的函式。

3.在Android Studio中使用C/C++時,一般需要Makefile或CMake進行配置構建,以及LLDB偵錯程式。

優點:

1.效能快,C/C++編譯時的過程是可執行檔案到機器碼,java執行的過程是位元組碼到jvm虛擬機器再到機器碼。

2.安全性高,APK中的java層程式碼很容易被反編譯,C/C++庫反編譯比較難。

3.容易移植,不依賴平臺,方便移植到其他平臺使用。

4.複用性高,早期大多數第三方庫都是用C/C++編寫的,方便使用第三方庫或封裝自己開發的底層原始碼。

2.JNI是什麼

JNI(Java Native Interface):

1.JNI是Java本地介面,也就是Java與C/C++相互通訊的介面。

2.NDK開發前需要引入jni.h標頭檔案,通過一系列的轉換,完成Java與C/C++的互相呼叫。

3.互相呼叫時出現最多的是JNIEnv,這個型別代表了Java環境,JNIEnv*指標會被JNI傳入到native方法的實現函式中,通過這個指標可以對Java端的程式碼進行操作,比如獲取Java物件中的屬性並轉換成C/C++中的變數。

3.Makefile和CMake是什麼,有何作用

Makefile和CMake一起介紹的原因是這兩個編譯工具的作用大致相同,都是為了將C/C++程式碼編譯成原生庫,然後打包到APK中,被Java層呼叫。

Makefile:

1.Makefile可以定義專案中庫、模組、原始檔之間的各種依賴關係,也能夠定義檔案的編譯順序,還可以定義其他更復雜的規則,類似於一個指令碼。

2.在Android中,Makefile依靠ndk-build指令碼編譯工具來完成配置編譯,只需要編寫Android.mk和Application.mk兩個Makefile檔案,這種構建方式在eclipse中比較常見。

3.Makefile依賴於編譯平臺,在不同的平臺上有不同的編譯工具,遵循的規則也不相同,所以在不同的平臺上編譯時,需要重新配置Makefile,工作量較大,也容易出錯。

CMake:

1.CMake是一個跨平臺的編譯工具,很好的解決了上述問題,推薦使用。

2.CMake是Android Studio中新的構建方式,只需要配置CMakeList.txt檔案即可,在CMakeList.txt定義哪些檔案需要編譯以及與其他靜態庫或動態庫的依賴關係。

3.在使用CMake時,需要將Gradle關聯到CMake專案,並且可以在build.gradle中配置特定的NDK變數,用來改變CMake構建原生庫的方式。

相關文章