1. 程式人生 > >NDK開發筆記---CMake構建JNI

NDK開發筆記---CMake構建JNI

  從AndroidStudio2.2版本開始,預設使用 CMake 的方式來構建NDK專案,也可以使用 ndk-build 的方式,這裡我們主要介紹 CMake 的方式。

  首先,介紹 NDK 的下載與安裝,在SDK設定那個頁面,選擇SDK Tools面板,就可以下載NDK。


如圖所示,需要下載CMake、LLDB、NDK元件:

  • NDK
  這套工具集允許您為 Android 使用 C 和 C++ 程式碼,並提供眾多平臺庫,讓您可以管理原生 Activity 和訪問物理裝置元件,例如感測器和觸控輸入。
  • CMake
一款外部構建工具,可與 Gradle 搭配使用來構建原生庫。如果您只計劃使用 ndk-build,則不需要此元件。
  • LLDB
一種除錯程式,Android Studio 使用它來除錯原生程式碼。

預設建立帶C/C++ 支援的專案

我們在建立專案的時候,在嚮導的 Configure your new project 部分,選中 Include C++ Support 複選框如下圖所示:
在嚮導的 Customize C++ Support 部分,您可以使用下列選項自定義專案:
  • C++ Standard
使用下拉列表選擇您希望使用哪種 C++ 標準。選擇 Toolchain Default 會使用預設的 CMake 設定
  • Exceptions Support
如果您希望啟用對 C++ 異常處理的支援,請選中此複選框。如果啟用此複選框,Android Studio 會將 -fexceptions 標誌新增到模組級 build.gradle 檔案的 cppFlags 中,Gradle 會將其傳遞到 CMake。
  • Runtime Type Information Support
如果您希望支援 RTTI,請選中此複選框。如果啟用此複選框,Android Studio 會將 -frtti 標誌新增到模組級 build.gradle 檔案的 cppFlags 中,Gradle 會將其傳遞到 CMake。 可以根據自己專案需求進行選擇。在這裡,因為暫時用不到,直接點選完成即可。建立好的專案如下圖所示:
其中:
  • 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裡面定義的日誌庫。
     經過上面一系列的配置,專案就可以正常執行起來了。

例項:
我們可以稍微修改程式碼,然後傳一個字串,在介面顯示出來


在native-lib裡,以log庫為例,log庫是android下的,如果我們新建專案的時候勾選上了 Incude C++ Support,那麼自動生成的CMakeLists.txt裡面預設會為我們新增log庫。這裡巨集定義了個 LOG_TAG ,並巨集定義列印函式 __android_log_print ,我們傳入 ANDROID_LOG_ERROR ,所以是E級別。

輸出的結果為:



為已有專案新增C/C++支援

上面介紹的是用 Android Studio 建立帶C/C++支援的預設專案,下面我們介紹如何為已經有的專案新增C/C++支援。為了給出例子,我們先建立一個cmake-jni的專案。 首先,可以手動建立一個JNI目錄,如下圖所示:
然後在這個目錄可以手動建立我們的C/C++原始檔:fileCrypt.c
建立了一個CMake類:
在MainActivity裡面程式碼呼叫:

在cmake-jni的目錄下面建立一個File,名字為CMakeLists.txt,推薦使用這個名字和檔案路徑。
注意:必須先建立原始檔,否則下面建立CMake指令碼同步的時候不會通過。



CMakeLists.txt檔案的內容為:

注意:

   1. 路徑一定要注意跟我們所建立的目錄名字一致,注意你建立的是“jni”還是“cpp”目錄,否則同步不了。例如我們剛剛通過 Android Studio 建立的目錄實質上是“jni”目錄,因此這裡寫jni。你也可以手動建立 cpp目錄,然後這裡寫 cpp目錄,與標準的專案一樣。

   2.我們建立的有可能是 C 也有可能是 C++,所以這裡要注意寫 .c 還是 .cpp 字尾,否則同步會失敗。

然後選中 app,右擊,選擇下圖中的選項:

找到我們建立的指令碼檔案,確認:

Android Studio 就會自動同步,然後在 cmake-jni模組的 build.gradle檔案自動新增配置:

輸出的結果為:

參考文章: