一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

AndroidStudio用Cmake方式編譯NDK代碼(cmake配置.a庫(kù))

 instl 2018-10-09

1.cmake是什么?

CMake是一個(gè)跨平臺(tái)的安裝(編譯)工具,可以用簡(jiǎn)單的語(yǔ)句來(lái)描述所有平臺(tái)的安裝(編譯過(guò)程)。他能夠輸出各種各樣的makefile或者project文件,能測(cè)試編譯器所支持的C++特性,類似UNIX下的automake。

 

谷歌從AndroidStudio2.2以上就添加了Cmake方式來(lái)編譯NDK代碼,并從NDK例子看出,默認(rèn)編譯的方式就是cmake方式。

 

2.谷歌官方的用cmake方式編譯NDK的教程

 

谷歌從AndroidStudio2.2以上就添加了Cmake方式來(lái)編譯NDK代碼,并從NDK例子看出,默認(rèn)編譯的方式就是cmake方式。

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

  1. 創(chuàng)建新的原生源文件并將其添加到您的 Android Studio 項(xiàng)目中。
    • 如果您已經(jīng)擁有原生代碼或想要導(dǎo)入預(yù)構(gòu)建的原生庫(kù),則可以跳過(guò)此步驟。
  2. 創(chuàng)建 CMake 構(gòu)建腳本,將您的原生源代碼構(gòu)建到庫(kù)中。如果導(dǎo)入和關(guān)聯(lián)預(yù)構(gòu)建庫(kù)或平臺(tái)庫(kù),您也需要此構(gòu)建腳本。
    • 如果您的現(xiàn)有原生庫(kù)已經(jīng)擁有 CMakeLists.txt 構(gòu)建腳本或者使用 ndk-build 并包含 Android.mk 構(gòu)建腳本,則可以跳過(guò)此步驟。
  3. 提供一個(gè)指向您的 CMake 或 ndk-build 腳本文件的路徑,將 Gradle 關(guān)聯(lián)到您的原生庫(kù)。Gradle 使用構(gòu)建腳本將源代碼導(dǎo)入您的 Android Studio 項(xiàng)目并將原生庫(kù)(SO 文件)封裝到 APK 中。

配置完項(xiàng)目后,您可以使用 JNI 框架從 Java 代碼中訪問(wèn)您的原生函數(shù)。要構(gòu)建和運(yùn)行應(yīng)用,只需點(diǎn)擊 Run 。Gradle 會(huì)以依賴項(xiàng)的形式添加您的外部原生構(gòu)建流程,用于編譯、構(gòu)建原生庫(kù)并將其隨 APK 一起封裝。

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

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

  1. 從 IDE 的左側(cè)打開(kāi) Project 窗格并從下拉菜單中選擇 Project 視圖。
  2. 導(dǎo)航到您的模塊 > src,右鍵點(diǎn)擊 main 目錄,然后選擇 New > Directory。
  3. 為目錄輸入一個(gè)名稱(例如 cpp)并點(diǎn)擊 OK。
  4. 右鍵點(diǎn)擊您剛剛創(chuàng)建的目錄,然后選擇 New > C/C++ Source File。
  5. 為您的源文件輸入一個(gè)名稱,例如 native-lib
  6. 從 Type 下拉菜單中,為您的源文件選擇文件擴(kuò)展名,例如 .cpp。
    • 點(diǎn)擊 Edit File Types ,您可以向下拉菜單中添加其他文件類型,例如 .cxx 或 .hxx。在彈出的 C/C++ 對(duì)話框中,從 Source Extension 和 Header Extension 下拉菜單中選擇另一個(gè)文件擴(kuò)展名,然后點(diǎn)擊 OK。
  7. 如果您還希望創(chuàng)建一個(gè)標(biāo)頭文件,請(qǐng)選中 Create an associated header 復(fù)選框。
  8. 點(diǎn)擊 OK。

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

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

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

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

  1. 從 IDE 的左側(cè)打開(kāi) Project 窗格并從下拉菜單中選擇 Project 視圖。
  2. 右鍵點(diǎn)擊您的模塊的根目錄并選擇 New > File

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

  3. 輸入“CMakeLists.txt”作為文件名并點(diǎn)擊 OK

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

復(fù)制代碼
# 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 )
復(fù)制代碼

 

使用 add_library() 向您的 CMake 構(gòu)建腳本添加源文件或庫(kù)時(shí),Android Studio 還會(huì)在您同步項(xiàng)目后在 Project 視圖下顯示關(guān)聯(lián)的標(biāo)頭文件。不過(guò),為了確保 CMake 可以在編譯時(shí)定位您的標(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ī)范來(lái)為庫(kù)文件命名:

lib庫(kù)名稱.so

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

static {
    System.loadLibrary(“native-lib”);
}

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

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

添加 NDK API

Android NDK 提供了一套實(shí)用的原生 API 和庫(kù)。通過(guò)將 NDK 庫(kù)包含到項(xiàng)目的 CMakeLists.txt 腳本文件中,您可以使用這些 API 中的任意一種。

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

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

復(fù)制代碼
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 )
復(fù)制代碼

 

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

復(fù)制代碼
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} )
復(fù)制代碼

 

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

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

復(fù)制代碼
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} )
復(fù)制代碼

 

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

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

add_library( imported-lib
             SHARED
             IMPORTED )

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

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

復(fù)制代碼
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 )
復(fù)制代碼

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

include_directories( imported-lib/include/ )

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

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

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

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

 

導(dǎo)入.a靜態(tài)庫(kù)

自 android studio 2.2 +后就集成了ndk開(kāi)發(fā), 自帶cmake 編譯器.  編寫ndk時(shí)候,配置很簡(jiǎn)單。再也不需要用android.mk配置文件。

新建一個(gè)帶ndk開(kāi)發(fā)項(xiàng)目的結(jié)構(gòu)是這樣的,

 

 

言歸正傳,那么要添加第三方的xx.a鏈接庫(kù)呢?

通常我們把第三方提供的h文件夾,放在cpp的include里面。這是規(guī)范,不是必須。而xxx.a庫(kù)放在src/main/jniLibs/armeabi目錄下。

本文章以添加libjsoncpp.a連接庫(kù)做例子

首先在cpp目錄下建立一個(gè)include文件夾,把jsoncpp官方提供的頭文件文件夾拷貝到include里面(我這個(gè)項(xiàng)目有3個(gè)鏈接庫(kù),jsoncpp, curl , openssl,另外2個(gè)僅做參考作用,與其無(wú)關(guān))

 

 

第二步, 在app的src目錄的main下,建立一個(gè)文件夾,jniLibs,然后在jniLibs里面再建立一個(gè)armeabi文件夾。

然后把libjsoncpp.a鏈接庫(kù)拷貝進(jìn)去。

 

第三步, 動(dòng)態(tài)庫(kù)與頭文件拷貝進(jìn)去時(shí)候,是需要告訴編譯器做關(guān)聯(lián)的。在app目錄的src文件夾下有個(gè)CMakeLists.txt文件,我們通過(guò)它編寫配置信息。

jsoncpp頭文件所在目錄告訴編譯,在里面添加

  1. include_directories( src/main/cpp/include/jsoncpp)  

如果有多個(gè)鏈接庫(kù),那么可以這樣
例如有三個(gè)鏈接庫(kù),jsoncpp, currl , openssl.

  1. include_directories( src/main/cpp/include/jsoncpp  
  2.                      src/main/cpp/include/curl  
  3.                      src/main/cpp/include/openssl  
  4.                      )  
 

然后告訴編譯器,libjsoncppp.a在哪個(gè)目錄下,并指定鏈接庫(kù)的名稱

接著添加

  1. #添加json庫(kù)  
  2. add_library(jsoncpp STATIC IMPORTED)  
  3. set_target_properties(jsoncpp  
  4.   PROPERTIES IMPORTED_LOCATION  
  5.   ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libjsoncpp.a)  

然后修改target_link_libraries,加多一行jsoncpp

  1. target_link_libraries(native-lib  
  2.                       jsoncpp  
  3.                       ${log-lib})  

如果有多個(gè),那么可以多次添加。如

  1. #添加json庫(kù)  
  2. add_library(jsoncpp STATIC IMPORTED)  
  3. set_target_properties(jsoncpp  
  4.   PROPERTIES IMPORTED_LOCATION  
  5.   ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libjsoncpp.a)  
  6.   
  7. #添加curl網(wǎng)絡(luò)請(qǐng)求  
  8. add_library(curl STATIC IMPORTED)  
  9. set_target_properties(curl  
  10.   PROPERTIES IMPORTED_LOCATION  
  11.   ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libcurl.a)  
  12.   
  13. #添加加密工具(md5, base64, des, aes , asa) part-1  
  14. add_library(crypto STATIC IMPORTED)  
  15. set_target_properties(crypto  
  16.   PROPERTIES IMPORTED_LOCATION  
  17.   ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libcrypto.a)  
  18.   
  19. #添加加密工具(md5, base64, des, aes , asa) des加密 part-2  
  20. add_library(ssl STATIC IMPORTED)  
  21. set_target_properties(ssl  
  22.   PROPERTIES IMPORTED_LOCATION  
  23.   ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libssl.a)  
  1. target_link_libraries(native-lib  
  2.                       jsoncpp  
  3.                       curl  
  4.                       crypto  
  5.                       ssl  
  6.                       ${log-lib})   

然后gradle編譯就可以使用了。是不是很簡(jiǎn)單?

 

 

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

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

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

:更改 Gradle 配置時(shí),請(qǐng)確保通過(guò)點(diǎn)擊工具欄中的 Sync Project  應(yīng)用更改。此外,如果在將 CMake 或 ndk-build 腳本文件關(guān)聯(lián)到 Gradle 后再對(duì)其進(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 項(xiàng)目:

  1. 從 IDE 左側(cè)打開(kāi) Project 窗格并選擇 Android 視圖。
  2. 右鍵點(diǎn)擊您想要關(guān)聯(lián)到原生庫(kù)的模塊(例如 app 模塊),并從菜單中選擇 Link C++ Project with Gradle。您應(yīng)看到一個(gè)如圖 4 所示的對(duì)話框。
  3. 從下拉菜單中,選擇 CMake 或 ndk-build。
    1. 如果您選擇 CMake,請(qǐng)使用 Project Path 旁的字段為您的外部 CMake 項(xiàng)目指定 CMakeLists.txt 腳本文件。
    2. 如果您選擇 ndk-build,請(qǐng)使用 Project Path 旁的字段為您的外部 ndk-build 項(xiàng)目指定 Android.mk 腳本文件。如果 Application.mk 文件與您的 Android.mk 文件位于相同目錄下,Android Studio 也會(huì)包含此文件。

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

  4. 點(diǎn)擊 OK。

手動(dòng)配置 Gradle

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

復(fù)制代碼
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"
    }
  }
}
復(fù)制代碼

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

指定可選配置

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

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

復(fù)制代碼
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 {...}
  }
}
復(fù)制代碼

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

指定 ABI

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

復(fù)制代碼
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 {...}
}
復(fù)制代碼

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

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

 

谷歌從AndroidStudio2.2以上就添加了Cmake方式來(lái)編譯NDK代碼,并從NDK例子看出,默認(rèn)編譯的方式就是cmake方式。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    大香蕉伊人一区二区三区| 亚洲欧美日本国产有色| 老司机精品一区二区三区| 亚洲熟女少妇精品一区二区三区| 99久久精品午夜一区| 精品人妻一区二区三区免费看| 国产精品一级香蕉一区| 日本和亚洲的香蕉视频| 99久久国产精品免费| 日本午夜一本久久久综合| 亚洲中文字幕高清乱码毛片| 精品熟女少妇av免费久久野外| 欧美日韩在线视频一区| 麻豆精品在线一区二区三区| 日韩综合国产欧美一区| 日韩黄色大片免费在线| 国产香蕉国产精品偷在线观看| 亚洲乱码av中文一区二区三区| 国产色第一区不卡高清| 亚洲av日韩av高潮无打码| 激情亚洲一区国产精品久久| 亚洲欧美日韩熟女第一页| 国产视频在线一区二区| 99视频精品免费视频播放| 日韩成人动作片在线观看| 亚洲av又爽又色又色| 99久久精品午夜一区二区| 成人日韩视频中文字幕| 99热中文字幕在线精品| 日韩专区欧美中文字幕| 久久夜色精品国产高清不卡| 青青操精品视频在线观看| 日木乱偷人妻中文字幕在线| 国内女人精品一区二区三区| 午夜国产精品国自产拍av| 国产性情片一区二区三区| 国产精品久久男人的天堂| 可以在线看的欧美黄片| 国产人妻精品区一区二区三区| 国产永久免费高清在线精品| 精品一区二区三区中文字幕|