1. 程式人生 > >Android NDK開發之CMake

Android NDK開發之CMake

知之為知之,不知為不知

哇!(先來個王者之哇助助興),最近的專案一直用到Android NDK,簡直頭皮發麻,每次底層出現問題,都要找同事幫忙,甚是尷尬,於是看一些帖子,稍微整理了一下,做個小筆記,同時也分享一下前人之經驗.不說了,開始進入正題.

Android開發環境

工具:Android Studio 3.0.1

開發jni工具 : CMake

要使用CMake進行jni開發,需要一下環境配置(假設你已配置好sdk): 

第一:下載相關外掛

開啟Android studio --- >  Setting --- > Appearance Behavior --- > System Setting --- > Android SDK --- >SDK Tools

勾選Cmake 、LLDB、Android SDK Platform-Tools、Android SDK、NDK、Support Repository(子選項全勾上),點選OK;

第二:配置ndk路徑

開啟Project Structure(使用快捷鍵Ctrl + Shift +A搜尋 或 使用工具欄開啟都可以),配置Android NDK location

使用形式:

分為兩種情況 :

第一種: 新建專案時,我已經知道 專案肯定要使用NDK程式設計,與C或者C++進行互動

第二種:專案都已經開始一段時間了,突然告知專案要與C或C++進行互動,使用NDK程式設計.(瞬間頭髮掉了一大片)

使用細節:

第一種:新建專案時部署

第一步:建立專案時,勾選Include C++ Support

第二步:根據需要 選擇C++ Standard(C++標準),一般沒有什麼特殊支援,預設就好

第三步:專案建立成功後,執行專案出現 : Hello from C++

             cpp目錄的作用  : 放置專案所有原生原始檔等構件庫;

             External Build File 作用

: 放置CMake 或 ndk-build 的構建指令碼,當前為CMakeLists.txt               

第四步:在MainActivity中新增一個本地方法,例如: public native String getStr(); 使用快捷鍵Alt + Enter選擇 Create ,

studio工具會在native-lib.cpp檔案中生成方法的實現,在對應的方法中寫入自己需要獲取的資訊即可.

如果寫入的語法以及引數獲取正常,正常執行可以獲取到從native層返回的引數.

第二種:專案開發過程中加入Cmake

第一步:在工程模組下新建一個CMakeLists.txt檔案(最好從新建以專案直接複製過來一個CMakeLists.txt修改)

修改其中的add_library(配置 庫名)      SHARED (生成動態庫)   資原始檔(例如 src/main/jni/ JniTest.c)

如果需要在c++中列印日誌,需要配置find_library 與 target+link_library (加入庫名與add library保持一致)

第二步:切換到Android檢視模式下,點選右鍵,選擇Link C++ Project with Gradle , 配置CMakeLists.txt的路徑,點選OK;

第三步: 在build.gradle(app)下,defaultConfig閉包內,加入:

externalNativeBuild {
    cmake {
        cppFlags ""   (如果使用 C++11 標準,則改為 "-std=c++11" )
        abiFilters 'armeabi-v7a','x86'  (生成.so庫的目標平臺)
    }
}

第四步: 新建Java(JniTest)類,用於宣告本地方法和載入動態庫,對於新建的本地方法報紅,直接Ctrl + Enter 選Create即可;

然後在 JniTest中就會生成相對應的jni方法

注意點1: 如果 快捷鍵沒有出現create ,那說明 .java類的名稱與 .c檔名稱不一致, 修改一致就可以快捷鍵生成.

注意點2: 修改.c檔名時,切記對應將 CMakeLists中的名稱也進行修改.

第五步: 在jni方法中修改需要返回的資料,在MainActivity中進行嘗試性呼叫即可.