您可以向 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 項目的步驟相似,但前者還需要執行一個額外的步驟:
- 在嚮導的 Choose your project 部分中,選擇 Native C++ 項目類型。
- 點擊 Next。
- 填寫嚮導下一部分中的所有其他字段。
- 點擊 Next。
- 在嚮導的 Customize C++ Support 部分中,您可以使用 C++ Standard 字段來自定義項目。使用下拉列表選擇您想要使用哪種 C++ 標準化。選擇 Toolchain Default 可使用默認的 CMake 設置。
- 點擊 Finish。
在 Android Studio 完成新項目的創建後,請從 IDE 左側打開 Project 窗格,然後選擇 Android 視圖。如圖 2 所示,Android Studio 會添加 cpp 組:
注意:此視圖並未反映磁盤上的實際文件層次結構,而是將相似的文件歸爲一組,以便簡化項目導航。
在 cpp 組中,您可以找到項目中的所有原生源代碼文件、頭文件、CMake 或 ndk-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++”。下面的概覽介紹了在構建和運行示例應用時會發生的事件:
- Gradle 調用您的外部構建腳本
CMakeLists.txt
。 - CMake 按照構建腳本中的命令將 C++ 源代碼文件
native-lib.cpp
編譯到共享的對象庫中,並將其命名爲libnative-lib.so
,Gradle 隨後會將後者打包到 APK 中。 - 運行時,應用的
MainActivity
會使用System.loadLibrary()
加載原生庫。現在,應用就可以使用庫的原生函數stringFromJNI()
了。 MainActivity.onCreate()
會調用stringFromJNI()
,後者會返回“Hello from C++”,並使用它來更新TextView
。
注意:Instant Run 與使用原生代碼編寫的項目組件不兼容。
如果想要驗證 Gradle 是否會將原生庫打包到 APK 中,您可以使用 APK 分析器:
- 依次選擇 Build > Build Bundles(s) / APK(s) > Build APK(s)。
- 依次選擇 Build > Analyze APK。
- 從
app/build/outputs/apk/
目錄中選擇 APK,然後點擊 OK。 - 如圖 3 所示,您可以在
lib/<ABI>/
下的 APK 分析器窗口中看到libnative-lib.so
。
提示:如果您想要利用其他使用了原生代碼的 Android 應用進行實驗,請依次點擊 File > New > Import Sample,然後從 Ndk 列表中選擇一個示例項目。
創建新的 C/C++ 源代碼文件
要將新的 C/C++ 源代碼文件添加到現有項目,請按以下步驟操作:
- 如果您的應用的主源代碼文件集內還沒有
cpp/
目錄,請按如下所示的方法創建一個:- 從 IDE 的左側打開 Project 窗格,然後從下拉菜單中選擇 Project 視圖。
- 轉到 your-module > src,右鍵點擊 main 目錄,然後依次選擇 New > Directory。
- 輸入
cpp
作爲目錄名稱,然後點擊 OK。
- 右鍵點擊
cpp/
目錄,然後依次選擇 New > C/C++ Source File。 - 爲您的源代碼文件輸入一個名稱,例如
native-lib
。 - 從 Type 下拉菜單中,爲您的源代碼文件選擇文件擴展名,例如
.cpp
。- 您可以向此下拉菜單添加其他文件類型(例如
.cxx
或.hxx
),只需點擊 Edit File Types 圖標 即可。在彈出的 C/C++ 對話框中,從 Source Extension 和 Header Extension 下拉菜單中選擇另一個文件擴展名,然後點擊 OK。
- 您可以向此下拉菜單添加其他文件類型(例如
- 如果您還想要創建頭文件,請選中 Create an associated header 複選框。
- 點擊 OK。
向項目添加新的 C/C++ 文件後,您仍需要配置 CMake 以將這些文件包含在原生庫中。
其他資源
要詳細瞭解如何在應用中支持 C/C++ 代碼,請嘗試參閱以下資源。
Codelab
- 使用 Android Studio 創建 Hello-CMake,這是一個 Codelab,它將向您介紹如何使用 Android Studio CMake 模板開始開發 Android NDK 項目