jni及NDK必須清楚的概念
目錄
- jni與ndk
- abi
- Android.mk、Application.mk、ndk-build
- CmakeLists、Cmake
jni
JNI(Java Native Interface):Java本地介面。是為了方便Java呼叫c、c++等原生代碼所封裝的一層介面(也是一個標準)。大家都知道,Java的優點是跨平臺,但是作為優點的同時,其在本地互動的時候就程式設計了缺點。Java的跨平臺特性導致其本地互動的能力不夠強大,一些和作業系統相關的特性Java無法完成,於是Java提供了jni專門用於和原生代碼互動,這樣就增強了Java語言的本地互動能力。
ndk
Android NDK 是一組允許您將 C 或 C++(“原生程式碼”)嵌入到 Android 應用中的工具。
NDK(Native Development Kit) : 原生開發工具包,即幫助開發原生程式碼的一系列工具,包括但不限於編譯工具、一些公共庫等。
abi
ABI(Application binary interface)應用程式二進位制介面。不同的CPU 與指令集的每種組合都有定義的 ABI (應用程式二進位制介面),一段程式只有遵循這個介面規範才能在該 CPU 上執行。
ABI 可以非常精確地定義應用的機器程式碼在執行時如何與系統互動。 NDK 根據這些定義構建 .so 檔案。 不同的 ABI 對應不同的架構:NDK 包含對 ARMEABI(預設)、MIPS 和 x86 的 ABI 支援。
ndk-build
ndk-build 檔案是 Android NDK r4 中引入的一個 shell 指令碼。其用途是呼叫正確的 NDK 構建指令碼。
ndk-build 指令碼用於在 NDK 中心啟動構建指令碼。這些指令碼:
- 自動探測您的開發系統和應用專案檔案以確定要構建的內容。
- 生成二進位制檔案。
- 將二進位制檔案複製到應用的專案路徑。
在使用ofollow,noindex">
ndk-build
指令碼構建時以及使用gdb.html" target="_blank" rel="nofollow,noindex">
ndk-gdb
指令碼除錯時需要掃描Android.mk
和Application.mk
Android.mk
必須在jni
資料夾內建立
Android.mk
配置檔案。ndk-build
指令碼將檢視此檔案,其中定義了模組及其名稱、要編譯的原始檔、版本標誌以及要連結的庫。
Application.mk
Application.mk
:此檔案列舉並描述您的應用需要的模組。 這些資訊包括:
- 用於針對特定平臺進行編譯的 ABI。
- 工具鏈。
- 要包含的標準庫(靜態和動態 STLport 或預設系統)。
CMake與CMakeLists
c/c++ 的編譯檔案在不同平臺是不一樣的。Unix 下會使用 makefile 檔案編譯,Windows 下會使用 project 檔案編譯。而 CMake 則是一個跨平臺的編譯工具,它並不會直接編譯出物件,而是根據自定義的語言規則(CMakeLists.txt)生成 對應 makefile 或 project 檔案,然後再呼叫底層的編譯。
在Android Studio 2.2 之後,工具中增加了 CMake 的支援,在新建專案時,選中Include C++ Support
複選框,預設使用CMake構建原生程式碼。你可以這麼認為,在 Android Studio 2.2 之後你有2種選擇來編譯你寫的 c/c++ 程式碼。一個是 ndk-build + Android.mk + Application.mk 組合,另一個是 CMake + CMakeLists.txt 組合。