27、Android項目添加C和C++代碼

您可以向 Android 項目添加 C 和 C++ 代碼,只需將相應的代碼添加到項目模塊的 cpp 目錄中即可。在您構建項目時,這些代碼會編譯到一個可由 Gradle 與您的 APK 打包在一起的原生庫中。然後,Java 或 Kotlin 代碼即可通過 Java 原生接口 (JNI) 調用原生庫中的函數。如需詳細瞭解如何使用 JNI 框架,請參閱 Android JNI 提示

Android Studio 支持適用於跨平臺項目的 CMake,以及速度比 CMake 更快但僅支持 Android 的 ndk-build。目前不支持在同一模塊中同時使用 CMake 和 ndk-build。

如果您想要將現有的 ndk-build 庫導入到 Android Studio 項目,請了解如何將 Gradle 關聯到原生庫項目

本頁將向您介紹如何設置 Android Studio以支持必要的構建工具、如何創建新項目並讓其支持 C/C++,以及如何向您的項目添加新的 C/C++ 文件

如果想要將原生代碼添加到現有項目,則需要按以下步驟操作:

1.創建新的原生源代碼文件,並將其添加到 Android Studio 項目。

        如果您已經擁有原生代碼或想要導入預構建的原生庫,可跳過此步驟。

2.配置 CMake 以將原生源代碼構建入庫。如果您要導入和關聯預構建庫或平臺庫,同樣需要此構建腳本。

        如果現有的原生庫已有 CMakeLists.txt 構建腳本,或使用 ndk-build 幷包含 Android.mk 構建腳本,您可以跳過此步驟。

3.提供 CMake 或 ndk-build 腳本文件的路徑以配置 Gradle。Gradle 使用構建腳本將源代碼導入您的 Android Studio 項目並將原生庫(SO 文件)打包到 APK 中。

配置完項目後,您可以使用 JNI 框架從 Java 或 Kotlin 代碼中訪問原生函數。要構建和運行應用,只需點擊運行圖標 從菜單欄運行應用 即可。

注意:如果您的現有項目使用已棄用的 ndkCompile 工具,您應該改用 CMake 或 ndk-build。要了解詳情,請轉到介紹如何從 ndkCompile 遷移的部分。

實驗性 Gradle 的用戶注意事項:如果您符合以下任意一種情況,請考慮遷移到插件版本 2.2.0 或更高版本,並使用 CMake 或 ndk-build 編譯原生庫:您的原生項目已經使用 CMake 或者 ndk-build;您想要使用穩定版本的 Gradle 編譯系統;或者您希望支持插件工具,例如 CCache。否則,您可以繼續使用實驗性版本的 Gradle 和 Android 插件

下載 NDK 和構建工具

如需爲您的應用編譯和調試原生代碼,您需要以下組件:

  • Android 原生開發套件 (NDK):一個工具集,讓您能夠在 Android 項目中使用 C 和 C++ 代碼;它提供了各種平臺庫,讓您能夠管理原生 Activity 並訪問物理設備組件,例如傳感器和輕觸輸入。
  • CMake:一款外部構建工具,可與 Gradle 搭配使用來構建原生庫。如果您只計劃使用 ndk-build,則不需要此組件。
  • LLDB:Android Studio 用於調試原生代碼的調試程序。

如需瞭解如何安裝這些組件,請參閱安裝及配置 NDK、CMake 和 LLDB

使用SDK管理器自帶CMake 3.6.0 或 3.10.2

SDK 管理器包含CMake的3.6.0派生版本和版本3.10.2。未在build.gradle中設置特定CMake版本的項目均使用CMake 3.10.2進行構建。要使用之前包含的版本,請在模塊的build.gradle文件中指定CMake版本3.6.0:

    android {
        ...
        externalNativeBuild {
            cmake {
                ...
                version "3.6.0"
            }
        }
    }

您可以指定此 CMake 版本作爲最低版本,只需在 build.gradle 條目的末尾添加一個“+”即可,例如 3.10.2+。不過,這並非最佳做法。

使用自定義 CMake 版本

如果您想使用 SDK 管理器中未包含的 CMake 版本 3.7 或更高版本,請按以下步驟操作:

1.從官方 CMake 網站下載並安裝 CMake 3.7 或更高版本

2.指定您想讓 Gradle 在模塊的 build.gradle 文件中使用的 CMake 版本:

    android {
        ...
        externalNativeBuild {
            cmake {
                ...
                version "cmake-version"
            }
        }
    }

3.將 CMake 的安裝路徑添加到 PATH 環境變量,或將其添加到項目的 local.properties 文件中,具體步驟如下所示。如果 Gradle 找不到您在 build.gradle 文件中指定的 CMake 版本,您便會遇到構建錯誤。

    # If you set this property, Gradle no longer uses PATH to find CMake.
    cmake.dir="path-to-cmake"
4.如果您尚未在工作站上安裝 Ninja 構建系統,請訪問 Ninja 官方網站,然後下載並安裝適用於您的操作系統的最新版 Ninja。此外,請務必將 Ninja 的安裝路徑也添加到PATH環境變量。

創建支持 C/C++ 的新項目

創建支持原生代碼的新項目的步驟與創建任何其他 Android Studio 項目的步驟相似,但前者還需要執行一個額外的步驟:

  1. 在嚮導的 Choose your project 部分中,選擇 Native C++ 項目類型。
  2. 點擊 Next
  3. 填寫嚮導下一部分中的所有其他字段。
  4. 點擊 Next
  5. 在嚮導的 Customize C++ Support 部分中,您可以使用 C++ Standard 字段來自定義項目。使用下拉列表選擇您想要使用哪種 C++ 標準化。選擇 Toolchain Default 可使用默認的 CMake 設置。
  6. 點擊 Finish

在 Android Studio 完成新項目的創建後,請從 IDE 左側打開 Project 窗格,然後選擇 Android 視圖。如圖 2 所示,Android Studio 會添加 cpp 組:

圖 1. 原生源代碼和外部構建腳本的 Android 視圖組

注意:此視圖並未反映磁盤上的實際文件層次結構,而是將相似的文件歸爲一組,以便簡化項目導航。

在 cpp 組中,您可以找到項目中的所有原生源代碼文件頭文件CMakendk-build 的構建腳本,以及項目中的預構建庫。對於新項目,Android Studio 會創建一個示例 C++ 源代碼文件 native-lib.cpp,並將其置於應用模塊的 src/main/cpp/ 目錄中。此示例代碼提供了一個簡單的 C++ 函數 stringFromJNI(),它會返回字符串“Hello from C++”。要了解如何向項目添加其他源代碼文件,請參閱介紹如何創建新的原生源代碼文件的部分。

與 build.gradle 文件指示 Gradle 如何構建應用一樣,CMake 和 ndk-build 需要構建腳本以確定如何構建您的原生庫。對於新項目,Android Studio 會創建 CMake 構建腳本 CMakeLists.txt,並將其置於模塊的根目錄中。要詳細瞭解此構建腳本的內容,請參閱配置 CMake

構建和運行示例應用

點擊 Run 圖標 從菜單欄運行應用 後,Android Studio 會構建並啓動一個應用,此應用會在您的 Android 設備或模擬器上顯示文字“Hello from C++”。下面的概覽介紹了在構建和運行示例應用時會發生的事件:

  1. Gradle 調用您的外部構建腳本 CMakeLists.txt
  2. CMake 按照構建腳本中的命令將 C++ 源代碼文件 native-lib.cpp 編譯到共享的對象庫中,並將其命名爲 libnative-lib.so,Gradle 隨後會將後者打包到 APK 中。
  3. 運行時,應用的 MainActivity 會使用 System.loadLibrary() 加載原生庫。現在,應用就可以使用庫的原生函數 stringFromJNI() 了。
  4. MainActivity.onCreate() 會調用 stringFromJNI(),後者會返回“Hello from C++”,並使用它來更新 TextView

注意Instant Run 與使用原生代碼編寫的項目組件不兼容。

如果想要驗證 Gradle 是否會將原生庫打包到 APK 中,您可以使用 APK 分析器

  1. 依次選擇 Build > Build Bundles(s) / APK(s) > Build APK(s)
  2. 依次選擇 Build > Analyze APK
  3. 從 app/build/outputs/apk/ 目錄中選擇 APK,然後點擊 OK
  4. 如圖 3 所示,您可以在 lib/<ABI>/ 下的 APK 分析器窗口中看到 libnative-lib.so。 
    圖 2. 使用 APK 分析器查找原生庫

     

提示:如果您想要利用其他使用了原生代碼的 Android 應用進行實驗,請依次點擊 File > New > Import Sample,然後從 Ndk 列表中選擇一個示例項目。

創建新的 C/C++ 源代碼文件

要將新的 C/C++ 源代碼文件添加到現有項目,請按以下步驟操作:

  1. 如果您的應用的主源代碼文件集內還沒有 cpp/ 目錄,請按如下所示的方法創建一個:
    1. 從 IDE 的左側打開 Project 窗格,然後從下拉菜單中選擇 Project 視圖。
    2. 轉到 your-module > src,右鍵點擊 main 目錄,然後依次選擇 New > Directory
    3. 輸入 cpp 作爲目錄名稱,然後點擊 OK
  2. 右鍵點擊 cpp/ 目錄,然後依次選擇 New > C/C++ Source File
  3. 爲您的源代碼文件輸入一個名稱,例如 native-lib
  4. 從 Type 下拉菜單中,爲您的源代碼文件選擇文件擴展名,例如 .cpp
    • 您可以向此下拉菜單添加其他文件類型(例如 .cxx 或 .hxx),只需點擊 Edit File Types 圖標  即可。在彈出的 C/C++ 對話框中,從 Source Extension 和 Header Extension 下拉菜單中選擇另一個文件擴展名,然後點擊 OK
  5. 如果您還想要創建頭文件,請選中 Create an associated header 複選框。
  6. 點擊 OK

向項目添加新的 C/C++ 文件後,您仍需要配置 CMake 以將這些文件包含在原生庫中。

其他資源

要詳細瞭解如何在應用中支持 C/C++ 代碼,請嘗試參閱以下資源。

Codelab

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章