cmake式j(luò)ni開發(fā)

向您的項目添加 C 和 C++ 代碼

本文內(nèi)容

下載 NDK 和構(gòu)建工具

創(chuàng)建支持 C/C++ 的新項目

構(gòu)建和運行示例應(yīng)用

向現(xiàn)有項目添加 C/C++ 代碼

創(chuàng)建新的原生源文件

創(chuàng)建 CMake 構(gòu)建腳本

將 Gradle 關(guān)聯(lián)到您的原生庫

搭配使用Android Studio 2.2 或更高版本Android Plugin for Gradle 版本 2.2.0 或更高版本時,您可以將 C 和 C++ 代碼編譯到 Gradle 與 APK 一起封裝的原生庫中,將這類代碼添加到您的應(yīng)用中。您的 Java 代碼隨后可以通過 Java 原生接口 (JNI) 調(diào)用您的原生庫中的函數(shù)。如果您想要詳細(xì)了解如何使用 JNI 框架,請閱讀Android 的 JNI 提示

Android Studio 用于構(gòu)建原生庫的默認(rèn)工具是 CMake。由于很多現(xiàn)有項目都使用構(gòu)建工具包編譯其原生代碼,Android Studio 還支持ndk-build。如果您想要將現(xiàn)有的 ndk-build 庫導(dǎo)入到您的 Android Studio 項目中,請參閱介紹如何配置 Gradle 以關(guān)聯(lián)到您的原生庫的部分。不過,如果您在創(chuàng)建新的原生庫,則應(yīng)使用 CMake。

本頁面介紹的信息可以幫助您使用所需構(gòu)建工具設(shè)置 Android Studio、創(chuàng)建或配置項目以支持 Android 上的原生代碼,以及構(gòu)建和運行應(yīng)用。

注:如果您的現(xiàn)有項目使用已棄用的ndkCompile工具,則應(yīng)先打開build.properties文件,并移除以下代碼行,然后再將 Gradle 關(guān)聯(lián)到您的原生庫

// Remove this line

android.useDeprecatedNdk = true

實驗性 Gradle 的用戶注意事項:如果您是以下任意一種情況,請考慮遷移到插件版本 2.2.0 或更高版本并使用 CMake 或 ndk-build 構(gòu)建原生庫:您的原生項目已經(jīng)使用 CMake 或者 ndk-build;但是您想要使用穩(wěn)定版本的 Gradle 構(gòu)建系統(tǒng);或者您希望支持插件工具,例如CCache。否則,您可以繼續(xù)使用實驗性版本的 Gradle 和 Android 插件

下載 NDK 和構(gòu)建工具

要為您的應(yīng)用編譯和調(diào)試原生代碼,您需要以下組件:

Android 原生開發(fā)工具包 (NDK):這套工具集允許您為 Android 使用 C 和 C++ 代碼,并提供眾多平臺庫,讓您可以管理原生 Activity 和訪問物理設(shè)備組件,例如傳感器和觸摸輸入。

CMake:一款外部構(gòu)建工具,可與 Gradle 搭配使用來構(gòu)建原生庫。如果您只計劃使用 ndk-build,則不需要此組件。

LLDB:一種調(diào)試程序,Android Studio 使用它來調(diào)試原生代碼

您可以使用 SDK 管理器安裝這些組件:

在打開的項目中,從菜單欄選擇Tools > Android > SDK Manager。

點擊SDK Tools標(biāo)簽。

選中LLDB、CMake和NDK旁的復(fù)選框,如圖 1 所示。


圖 1.從 SDK 管理器中安裝 LLDB、CMake 和 NDK。

點擊Apply,然后在彈出式對話框中點擊OK。

安裝完成后,點擊Finish,然后點擊OK。

創(chuàng)建支持 C/C++ 的新項目

創(chuàng)建支持原生代碼的項目與創(chuàng)建任何其他 Android Studio 項目類似,不過前者還需要額外幾個步驟:

在向?qū)У腃onfigure your new project部分,選中Include C++ Support復(fù)選框。

點擊Next。

正常填寫所有其他字段并完成向?qū)Ы酉聛淼膸讉€部分。

在向?qū)У腃ustomize C++ Support部分,您可以使用下列選項自定義項目:

C++ Standard:使用下拉列表選擇您希望使用哪種 C++ 標(biāo)準(zhǔn)。選擇Toolchain Default會使用默認(rèn)的 CMake 設(shè)置。

Exceptions Support:如果您希望啟用對 C++ 異常處理的支持,請選中此復(fù)選框。如果啟用此復(fù)選框,Android Studio 會將-fexceptions標(biāo)志添加到模塊級build.gradle文件的cppFlags中,Gradle 會將其傳遞到 CMake。

Runtime Type Information Support:如果您希望支持 RTTI,請選中此復(fù)選框。如果啟用此復(fù)選框,Android Studio 會將-frtti標(biāo)志添加到模塊級build.gradle文件的cppFlags中,Gradle 會將其傳遞到 CMake。

點擊Finish。

在 Android Studio 完成新項目的創(chuàng)建后,請從 IDE 左側(cè)打開Project窗格并選擇Android視圖。如圖 2 中所示,Android Studio 將添加cpp和External Build Files組:


圖 2.您的原生源文件和外部構(gòu)建腳本的 Android 視圖組。

注:此視圖無法反映磁盤上的實際文件層次結(jié)構(gòu),而是將相似文件分到一組中,簡化項目導(dǎo)航。

在cpp組中,您可以找到屬于項目的所有原生源文件、標(biāo)頭和預(yù)構(gòu)建庫。對于新項目,Android Studio 會創(chuàng)建一個示例 C++ 源文件native-lib.cpp,并將其置于應(yīng)用模塊的src/main/cpp/目錄中。本示例代碼提供了一個簡單的 C++ 函數(shù)stringFromJNI(),此函數(shù)可以返回字符串“Hello from C++”。要了解如何向項目添加其他源文件,請參閱介紹如何創(chuàng)建新的原生源文件的部分。

在External Build Files組中,您可以找到 CMake 或 ndk-build 的構(gòu)建腳本。與build.gradle文件指示 Gradle 如何構(gòu)建應(yīng)用一樣,CMake 和 ndk-build 需要一個構(gòu)建腳本來了解如何構(gòu)建您的原生庫。對于新項目,Android Studio 會創(chuàng)建一個 CMake 構(gòu)建腳本CMakeLists.txt,并將其置于模塊的根目錄中。要詳細(xì)了解此構(gòu)建腳本的內(nèi)容,請參閱介紹如何創(chuàng)建 Cmake 構(gòu)建腳本的部分。

構(gòu)建和運行示例應(yīng)用

點擊Run

后,Android Studio 將在您的 Android 設(shè)備或者模擬器上構(gòu)建并啟動一個顯示文字“Hello from C++”的應(yīng)用。下面的概覽介紹了構(gòu)建和運行示例應(yīng)用時會發(fā)生的事件:

Gradle 調(diào)用您的外部構(gòu)建腳本CMakeLists.txt。

CMake 按照構(gòu)建腳本中的命令將 C++ 源文件native-lib.cpp編譯到共享的對象庫中,并命名為libnative-lib.so,Gradle 隨后會將其封裝到 APK 中。

運行時,應(yīng)用的MainActivity會使用System.loadLibrary()加載原生庫。現(xiàn)在,應(yīng)用可以使用庫的原生函數(shù)stringFromJNI()。

MainActivity.onCreate()調(diào)用stringFromJNI(),這將返回“Hello from C++”并使用這些文字更新TextView

注:Instant Run與使用原生代碼的項目不兼容。Android Studio 會自動停用此功能。

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

選擇Build > Analyze APK。

從app/build/outputs/apk/目錄中選擇 APK 并點擊OK。

如圖 3 中所示,您會在 APK 分析器窗口的lib//下看到libnative-lib.so。


圖 3.使用 APK 分析器定位原生庫。

提示:如果您想要試驗使用原生代碼的其他 Android 應(yīng)用,請點擊File > New > Import Sample并從Ndk列表中選擇示例項目。

向現(xiàn)有項目添加 C/C++ 代碼

如果您希望向現(xiàn)有項目添加原生代碼,請執(zhí)行以下步驟:

創(chuàng)建新的原生源文件并將其添加到您的 Android Studio 項目中。

如果您已經(jīng)擁有原生代碼或想要導(dǎo)入預(yù)構(gòu)建的原生庫,則可以跳過此步驟。

創(chuàng)建 CMake 構(gòu)建腳本,將您的原生源代碼構(gòu)建到庫中。如果導(dǎo)入和關(guān)聯(lián)預(yù)構(gòu)建庫或平臺庫,您也需要此構(gòu)建腳本。

如果您的現(xiàn)有原生庫已經(jīng)擁有CMakeLists.txt構(gòu)建腳本或者使用 ndk-build 并包含Android.mk構(gòu)建腳本,則可以跳過此步驟。

提供一個指向您的 CMake 或 ndk-build 腳本文件的路徑,將 Gradle 關(guān)聯(lián)到您的原生庫。Gradle 使用構(gòu)建腳本將源代碼導(dǎo)入您的 Android Studio 項目并將原生庫(SO 文件)封裝到 APK 中。

配置完項目后,您可以使用JNI 框架從 Java 代碼中訪問您的原生函數(shù)。要構(gòu)建和運行應(yīng)用,只需點擊Run

。Gradle 會以依賴項的形式添加您的外部原生構(gòu)建流程,用于編譯、構(gòu)建原生庫并將其隨 APK 一起封裝。

創(chuàng)建新的原生源文件

要在應(yīng)用模塊的主源代碼集中創(chuàng)建一個包含新建原生源文件的cpp/目錄,請按以下步驟操作:

從 IDE 的左側(cè)打開Project窗格并從下拉菜單中選擇Project視圖。

導(dǎo)航到您的模塊> src,右鍵點擊main目錄,然后選擇New > Directory。

為目錄輸入一個名稱(例如cpp)并點擊OK。

右鍵點擊您剛剛創(chuàng)建的目錄,然后選擇New > C/C++ Source File。

為您的源文件輸入一個名稱,例如native-lib。

從Type下拉菜單中,為您的源文件選擇文件擴展名,例如.cpp。

點擊Edit File Types

,您可以向下拉菜單中添加其他文件類型,例如.cxx或.hxx。在彈出的C/C++對話框中,從Source Extension和Header Extension下拉菜單中選擇另一個文件擴展名,然后點擊OK。

如果您還希望創(chuàng)建一個標(biāo)頭文件,請選中Create an associated header復(fù)選框。

點擊OK。

創(chuàng)建 CMake 構(gòu)建腳本

如果您的原生源文件還沒有 CMake 構(gòu)建腳本,則您需要自行創(chuàng)建一個并包含適當(dāng)?shù)?CMake 命令。CMake 構(gòu)建腳本是一個純文本文件,您必須將其命名為CMakeLists.txt。本部分介紹了您應(yīng)包含到構(gòu)建腳本中的一些基本命令,用于在創(chuàng)建原生庫時指示 CMake 應(yīng)使用哪些源文件。

注:如果您的項目使用 ndk-build,則不需要創(chuàng)建 CMake 構(gòu)建腳本。提供一個指向您的Android.mk文件的路徑,將 Gradle 關(guān)聯(lián)到您的原生庫

要創(chuàng)建一個可以用作 CMake 構(gòu)建腳本的純文本文件,請按以下步驟操作:

從 IDE 的左側(cè)打開Project窗格并從下拉菜單中選擇Project視圖。

右鍵點擊您的模塊的根目錄并選擇New > File。

注:您可以在所需的任意位置創(chuàng)建構(gòu)建腳本。不過,在配置構(gòu)建腳本時,原生源文件和庫的路徑將與構(gòu)建腳本的位置相關(guān)。

輸入“CMakeLists.txt”作為文件名并點擊OK。

現(xiàn)在,您可以添加 CMake 命令,對您的構(gòu)建腳本進(jìn)行配置。要指示 CMake 從原生源代碼創(chuàng)建一個原生庫,請將cmake_minimum_required()add_library()命令添加到您的構(gòu)建腳本中:

# Sets the minimum version of CMake required to build your native library.

# This ensures that a certain set of CMake features is available to

# your build.

cmake_minimum_required(VERSION 3.4.1)

# Specifies a library name, specifies whether the library is STATIC or

# SHARED, and provides relative paths to the source code. You can

# define multiple libraries by adding multiple add.library() commands,

# and CMake builds them for you. When you build your app, Gradle

# automatically packages shared libraries with your APK.

add_library( # Specifies the name of the library.

native-lib

# Sets the library as a shared library.

SHARED

# Provides a relative path to your source file(s).

src/main/cpp/native-lib.cpp )

使用add_library()向您的 CMake 構(gòu)建腳本添加源文件或庫時,Android Studio 還會在您同步項目后在Project視圖下顯示關(guān)聯(lián)的標(biāo)頭文件。不過,為了確保 CMake 可以在編譯時定位您的標(biāo)頭文件,您需要將include_directories()命令添加到 CMake 構(gòu)建腳本中并指定標(biāo)頭的路徑:

add_library(...)

# Specifies a path to native header files.

include_directories(src/main/cpp/include/)

CMake 使用以下規(guī)范來為庫文件命名:

lib庫名稱.so

例如,如果您在構(gòu)建腳本中指定“native-lib”作為共享庫的名稱,CMake 將創(chuàng)建一個名稱為libnative-lib.so的文件。不過,在 Java 代碼中加載此庫時,請使用您在 CMake 構(gòu)建腳本中指定的名稱:

static {

????System.loadLibrary(“native-lib”);

}

注:如果您在 CMake 構(gòu)建腳本中重命名或移除某個庫,您需要先清理項目,Gradle 隨后才會應(yīng)用更改或者從 APK 中移除舊版本的庫。要清理項目,請從菜單欄中選擇Build > Clean Project。

Android Studio 會自動將源文件和標(biāo)頭添加到Project窗格的cpp組中。使用多個add_library()命令,您可以為 CMake 定義要從其他源文件構(gòu)建的更多庫。

添加 NDK API

Android NDK 提供了一套實用的原生 API 和庫。通過將NDK 庫包含到項目的CMakeLists.txt腳本文件中,您可以使用這些 API 中的任意一種。

預(yù)構(gòu)建的 NDK 庫已經(jīng)存在于 Android 平臺上,因此,您無需再構(gòu)建或?qū)⑵浞庋b到 APK 中。由于 NDK 庫已經(jīng)是 CMake 搜索路徑的一部分,您甚至不需要在您的本地 NDK 安裝中指定庫的位置 - 只需要向 CMake 提供您希望使用的庫的名稱,并將其關(guān)聯(lián)到您自己的原生庫。

find_library()命令添加到您的 CMake 構(gòu)建腳本中以定位 NDK 庫,并將其路徑存儲為一個變量。您可以使用此變量在構(gòu)建腳本的其他部分引用 NDK 庫。以下示例可以定位Android 特定的日志支持庫并將其路徑存儲在log-lib中:

find_library( # Defines the name of the path variable that stores the

# location of the NDK library.

log-lib

# Specifies the name of the NDK library that

# CMake needs to locate.

log )

為了確保您的原生庫可以在log庫中調(diào)用函數(shù),您需要使用 CMake 構(gòu)建腳本中的target_link_libraries()命令關(guān)聯(lián)庫:

find_library(...)

# Links your native library against one or more other native libraries.

target_link_libraries( # Specifies the target library.

native-lib

# Links the log library to the target library.

${log-lib} )

NDK 還以源代碼的形式包含一些庫,您在構(gòu)建和關(guān)聯(lián)到您的原生庫時需要使用這些代碼。您可以使用 CMake 構(gòu)建腳本中的add_library()命令,將源代碼編譯到原生庫中。要提供本地 NDK 庫的路徑,您可以使用ANDROID_NDK路徑變量,Android Studio 會自動為您定義此變量。

以下命令可以指示 CMake 構(gòu)建android_native_app_glue.c,后者會將NativeActivity生命周期事件和觸摸輸入置于靜態(tài)庫中并將靜態(tài)庫關(guān)聯(lián)到native-lib:

add_library( app-glue

STATIC

${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c )

# You need to link static libraries against your shared native library.

target_link_libraries( native-lib app-glue ${log-lib} )

添加其他預(yù)構(gòu)建庫

添加預(yù)構(gòu)建庫與為 CMake 指定要構(gòu)建的另一個原生庫類似。不過,由于庫已經(jīng)預(yù)先構(gòu)建,您需要使用IMPORTED標(biāo)志告知 CMake 您只希望將庫導(dǎo)入到項目中:

add_library( imported-lib

SHARED

IMPORTED )

然后,您需要使用set_target_properties()命令指定庫的路徑,如下所示。

某些庫為特定的 CPU 架構(gòu)(或應(yīng)用二進(jìn)制接口 (ABI))提供了單獨的軟件包,并將其組織到單獨的目錄中。此方法既有助于庫充分利用特定的 CPU 架構(gòu),又能讓您僅使用所需的庫版本。要向 CMake 構(gòu)建腳本中添加庫的多個 ABI 版本,而不必為庫的每個版本編寫多個命令,您可以使用ANDROID_ABI路徑變量。此變量使用NDK 支持的一組默認(rèn) ABI,或者您手動配置 Gradle而讓其使用的一組經(jīng)過篩選的 ABI。例如:

add_library(...)

set_target_properties( # Specifies the target library.

imported-lib

# Specifies the parameter you want to define.

PROPERTIES IMPORTED_LOCATION

# Provides the path to the library you want to import.

imported-lib/src/${ANDROID_ABI}/libimported-lib.so )

為了確保 CMake 可以在編譯時定位您的標(biāo)頭文件,您需要使用include_directories()命令,并包含標(biāo)頭文件的路徑:

include_directories( imported-lib/include/ )

注:如果您希望封裝一個并不是構(gòu)建時依賴項的預(yù)構(gòu)建庫(例如在添加屬于imported-lib依賴項的預(yù)構(gòu)建庫時),則不需要執(zhí)行以下說明來關(guān)聯(lián)庫。

要將預(yù)構(gòu)建庫關(guān)聯(lián)到您自己的原生庫,請將其添加到 CMake 構(gòu)建腳本的target_link_libraries()命令中:

target_link_libraries( native-lib imported-lib app-glue ${log-lib} )

在您構(gòu)建應(yīng)用時,Gradle 會自動將導(dǎo)入的庫封裝到 APK 中。您可以使用APK 分析器驗證 Gradle 將哪些庫封裝到您的 APK 中。如需了解有關(guān) CMake 命令的詳細(xì)信息,請參閱CMake 文檔

將 Gradle 關(guān)聯(lián)到您的原生庫

要將 Gradle 關(guān)聯(lián)到您的原生庫,您需要提供一個指向 CMake 或 ndk-build 腳本文件的路徑。在您構(gòu)建應(yīng)用時,Gradle 會以依賴項的形式運行 CMake 或 ndk-build,并將共享的庫封裝到您的 APK 中。Gradle 還使用構(gòu)建腳本來了解要將哪些文件添加到您的 Android Studio 項目中,以便您可以從Project窗口訪問這些文件。如果您的原生源文件沒有構(gòu)建腳本,則需要先創(chuàng)建 CMake 構(gòu)建腳本,然后再繼續(xù)。

將 Gradle 關(guān)聯(lián)到原生項目后,Android Studio 會更新Project窗格以在cpp組中顯示您的源文件和原生庫,在External Build Files組中顯示您的外部構(gòu)建腳本。

注:更改 Gradle 配置時,請確保通過點擊工具欄中的Sync Project

應(yīng)用更改。此外,如果在將 CMake 或 ndk-build 腳本文件關(guān)聯(lián)到 Gradle 后再對其進(jìn)行更改,您應(yīng)當(dāng)從菜單欄中選擇Build > Refresh Linked C++ Projects,將 Android Studio 與您的更改同步。

使用 Android Studio UI

您可以使用 Android Studio UI 將 Gradle 關(guān)聯(lián)到外部 CMake 或 ndk-build 項目:

從 IDE 左側(cè)打開Project窗格并選擇Android視圖。

右鍵點擊您想要關(guān)聯(lián)到原生庫的模塊(例如app模塊),并從菜單中選擇Link C++ Project with Gradle。您應(yīng)看到一個如圖 4 所示的對話框。

從下拉菜單中,選擇CMake或ndk-build。

如果您選擇CMake,請使用Project Path旁的字段為您的外部 CMake 項目指定CMakeLists.txt腳本文件。

如果您選擇ndk-build,請使用Project Path旁的字段為您的外部 ndk-build 項目指定Android.mk腳本文件。如果Application.mk文件與您的Android.mk文件位于相同目錄下,Android Studio 也會包含此文件。


圖 4.使用 Android Studio 對話框關(guān)聯(lián)外部 C++ 項目。

點擊OK。

手動配置 Gradle

要手動配置 Gradle 以關(guān)聯(lián)到您的原生庫,您需要將externalNativeBuild {}塊添加到模塊級build.gradle文件中,并使用cmake {}或ndkBuild {}對其進(jìn)行配置:

android {

????...

????defaultConfig {...}

????buildTypes {...}

????// Encapsulates your external native build configurations.

????externalNativeBuild {

????????// Encapsulates your CMake build configurations.

????????cmake {

????????????// Provides a relative path to your CMake build script.

????????????path "CMakeLists.txt"

????????}

????}

}

注:如果您想要將 Gradle 關(guān)聯(lián)到現(xiàn)有 ndk-build 項目,請使用ndkBuild {}塊而不是cmake {},并提供Android.mk文件的相對路徑。如果Application.mk文件與您的Android.mk文件位于相同目錄下,Gradle 也會包含此文件。

指定可選配置

您可以在模塊級build.gradle文件的defaultConfig {}塊中配置另一個externalNativeBuild {}塊,為 CMake 或 ndk-build 指定可選參數(shù)和標(biāo)志。與defaultConfig {}塊中的其他屬性類似,您也可以在構(gòu)建配置中為每個產(chǎn)品風(fēng)味重寫這些屬性。

例如,如果您的 CMake 或 ndk-build 項目定義多個原生庫,您可以使用targets屬性僅為給定產(chǎn)品風(fēng)味構(gòu)建和封裝這些庫中的一部分。以下代碼示例說明了您可以配置的部分屬性:

android {

????...

????defaultConfig {

????????...

????????// This block is different from the one you use to link Gradle

????????// to your CMake or ndk-build script.

????????externalNativeBuild {

????????????// For ndk-build, instead use ndkBuild {}

????????????cmake {

???????????????// Passes optional arguments to CMake.

????????????????arguments "-DANDROID_ARM_NEON=TRUE", "-DANDROID_TOOLCHAIN=clang"

????????????????// Sets optional flags for the C compiler.

????????????????cFlags "-D_EXAMPLE_C_FLAG1", "-D_EXAMPLE_C_FLAG2"

????????????????// Sets a flag to enable format macro constants for the C++ compiler.

????????????????cppFlags "-D__STDC_FORMAT_MACROS"

????????????}

????????}

????}

????buildTypes {...}

????productFlavors {

????...

????demo {

????????...

????????externalNativeBuild {

????????????cmake {

????????????????...

????????????????// Specifies which native libraries to build and package for this

????????????????// product flavor. If you don't configure this property, Gradle

????????????????// builds and packages all shared object libraries that you define

????????????????// in your CMake or ndk-build project.

????????????????targets "native-lib-demo"

????????????}

????????}

????}

????paid {

????????...

????????externalNativeBuild {

????????????cmake {

????????????????...

????????????????targets "native-lib-paid"

????????????}

????????}

????}

}

// Use this block to link Gradle to your CMake or ndk-build script.

externalNativeBuild {

????cmake {...}

????// or ndkBuild {...}

????}

}

要詳細(xì)了解配置產(chǎn)品風(fēng)味和構(gòu)建變體,請參閱配置構(gòu)建變體。如需了解您可以使用arguments屬性為 CMake 配置的變量列表,請參閱使用 CMake 變量

指定 ABI

默認(rèn)情況下,Gradle 會針對NDK 支持的 ABI將您的原生庫構(gòu)建到單獨的.so文件中,并將其全部封裝到您的 APK 中。如果您希望 Gradle 僅構(gòu)建和封裝原生庫的特定 ABI 配置,您可以在模塊級build.gradle文件中使用ndk.abiFilters標(biāo)志指定這些配置,如下所示:

android {

????...

????defaultConfig {

????????...

????????externalNativeBuild {

????????????cmake {...}

????????????// or ndkBuild {...}

????????}

????????ndk {

???????????// Specifies the ABI configurations of your native

???????????// libraries Gradle should build and package with your APK.

????????????abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a',

????????????'arm64-v8a'

????????}

????}

????buildTypes {...}

????externalNativeBuild {...}

}

在大多數(shù)情況下,您只需要在ndk {}塊中指定abiFilters(如上所示),因為它會指示 Gradle 構(gòu)建和封裝原生庫的這些版本。不過,如果您希望控制 Gradle 應(yīng)當(dāng)構(gòu)建的配置,并獨立于您希望其封裝到 APK 中的配置,請在defaultConfig.externalNativeBuild.cmake {}塊(或defaultConfig.externalNativeBuild.ndkBuild {}塊中)配置另一個abiFilters標(biāo)志。Gradle 會構(gòu)建這些 ABI 配置,不過僅會封裝您在defaultConfig.ndk{}塊中指定的配置。

為了進(jìn)一步降低 APK 的大小,請考慮配置 ABI APK 拆分,而不是創(chuàng)建一個包含原生庫所有版本的大型 APK,Gradle 會為您想要支持的每個 ABI 創(chuàng)建單獨的 APK,并且僅封裝每個 ABI 需要的文件。如果您配置 ABI 拆分,但沒有像上面的代碼示例一樣指定abiFilters標(biāo)志,Gradle 會構(gòu)建原生庫的所有受支持 ABI 版本,不過僅會封裝您在 ABI 拆分配置中指定的版本。為了避免構(gòu)建您不想要的原生庫版本,請為abiFilters標(biāo)志和 ABI 拆分配置提供相同的 ABI 列表。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,818評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,185評論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,656評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,647評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,446評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,951評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,041評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,189評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,718評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,800評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,419評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,420評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,755評論 2 371

推薦閱讀更多精彩內(nèi)容