NDK開發筆記---CMake構建JNI
從AndroidStudio2.2版本開始,預設使用 CMake 的方式來構建NDK專案,也可以使用 ndk-build 的方式,這裡我們主要介紹 CMake 的方式。
首先,介紹 NDK 的下載與安裝,在SDK設定那個頁面,選擇SDK Tools面板,就可以下載NDK。
如圖所示,需要下載CMake、LLDB、NDK元件:
- NDK
- CMake
- LLDB
預設建立帶C/C++ 支援的專案
我們在建立專案的時候,在嚮導的 Configure your new project 部分,選中 Include C++ Support 複選框如下圖所示:
在嚮導的 Customize C++ Support 部分,您可以使用下列選項自定義專案:
- C++ Standard
- Exceptions Support
- Runtime Type Information Support
其中:
- cpp目錄存放C/C++的標頭檔案或者原始檔
- External Build Files存放我們的CMake指令碼檔案,這是通過Gradle來進行配置的。
專案自動生成的部分c++程式碼:
自動生成的部分Java程式碼:
自動生成的build.gradle檔案:
android裡多了:
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
defaultConfig 裡多了:
externalNativeBuild {
cmake {
cppFlags ""
}
}
在主Mudule的跟目錄下多了個CMakeLists.txt,我們定製自己的原生程式碼的時候主要就是修改CMakeLists.txt裡面的配置:
我們可以看下CMakeLists.txt裡面的配置:
- add_library
裡面有三個引數配置:
native-lib:設定庫的名字為native-lib,名字可以任意,但是要和System.loadLibrary("native-lib");保持一致 。
SHARED:可以分享的,動態庫。
src/main/cpp/native-lib.cpp:配置原始檔或者標頭檔案的路徑
- find_library
將find_library()命令新增到CMake構建指令碼中以定位NDK庫,並將其路徑儲存為一個變數。可以使用此變數在構建指令碼的其他部分引用NDK庫。
log:找到log模組
- target_link_libraries
指定要關聯到原生庫的庫,第一個自然是我們add_library裡面指定的庫名字native-lib庫,然後可以看到${log-lib},也就是引用了find_library裡面定義的日誌庫。
經過上面一系列的配置,專案就可以正常執行起來了。
例項:
我們可以稍微修改程式碼,然後傳一個字串,在介面顯示出來
輸出的結果為:
為已有專案新增C/C++支援
上面介紹的是用 Android Studio 建立帶C/C++支援的預設專案,下面我們介紹如何為已經有的專案新增C/C++支援。為了給出例子,我們先建立一個cmake-jni的專案。 首先,可以手動建立一個JNI目錄,如下圖所示:然後在這個目錄可以手動建立我們的C/C++原始檔:fileCrypt.c
建立了一個CMake類:
在MainActivity裡面程式碼呼叫:
在cmake-jni的目錄下面建立一個File,名字為CMakeLists.txt,推薦使用這個名字和檔案路徑。
注意:必須先建立原始檔,否則下面建立CMake指令碼同步的時候不會通過。
注意:
1. 路徑一定要注意跟我們所建立的目錄名字一致,注意你建立的是“jni”還是“cpp”目錄,否則同步不了。例如我們剛剛通過 Android Studio 建立的目錄實質上是“jni”目錄,因此這裡寫jni。你也可以手動建立 cpp目錄,然後這裡寫 cpp目錄,與標準的專案一樣。
2.我們建立的有可能是 C 也有可能是 C++,所以這裡要注意寫 .c 還是 .cpp 字尾,否則同步會失敗。
然後選中 app,右擊,選擇下圖中的選項:
找到我們建立的指令碼檔案,確認:
Android Studio 就會自動同步,然後在 cmake-jni模組的 build.gradle檔案自動新增配置:
輸出的結果為:
參考文章: