cmake中文幫助文檔


CMake的

使用過Android Studio 2.2及更高版本,可以使用NDK和CMake的 編譯C和C ++代碼到本機庫。Android Studio中,然后構建系統使用Gradle把library打包到APK中

如果您是初次使用CMake的與Android Studio ,去C和C ++代碼添加到您的項目學習添加原生資源到項目的基礎,創造了CMake的構建腳本,並添加您的CMake項目作為一個gradle依賴。此頁面為您提供可以使用自定義您的CMake構建一些額外的信息。

了解CMake的生成命令


當調試CMake的構建問題,它有助於知道對於Android Studio使用特定生成的參數當用交叉編譯。

Android Studio中保存它使用用於執行CMake的構建,構建參數在cmake_build_command.txt文件。對於每一個應用程序二進制接口(ABI)您的應用程序的目標,每個構建類型為那些ABI的(即,釋放調試),Android Studio中生成的副本cmake_build_command.txt 用於特定的配置文件。Android Studio中,然后將其生成在以下目錄中的文件:

 

<project-root>/<module-root>/.externalNativeBuild/cmake/<build-type>/<ABI>/
 

提示:在Android Studio中,您可以快速通過使用搜索快捷鍵(查看這些文件shift+shift),並進入 cmake_build_command.txt在輸入字段。

下面的代碼段示出的參數的CMake一個例子來構建的可調試釋放hello-jni 樣品靶向armeabi-v7a架構。

 

Executable : /usr/local/google/home/{$USER}/Android/Sdk/cmake/3.6.3155560/bin/cmake
arguments :
-H/usr/local/google/home/{$USER}/Dev/github-projects/googlesamples/android-ndk/hello-jni/app/src/main/cpp
-B/usr/local/google/home/{$USER}/Dev/github-projects/googlesamples/android-ndk/hello-jni/app/.externalNativeBuild/cmake/arm7Debug/armeabi-v7a
-GAndroid Gradle - Ninja
-DANDROID_ABI=armeabi-v7a
-DANDROID_NDK=/usr/local/google/home/{$USER}/Android/Sdk/ndk-bundle
-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/usr/local/google/home/{$USER}/Dev/github-projects/googlesamples/android-ndk/hello-jni/app/build/intermediates/cmake/arm7/debug/obj/armeabi-v7a
-DCMAKE_BUILD_TYPE=Debug
-DCMAKE_MAKE_PROGRAM=/usr/local/google/home/{$USER}/Android/Sdk/cmake/3.6.3155560/bin/ninja
-DCMAKE_TOOLCHAIN_FILE=/usr/local/google/home/{$USER}/Android/Sdk/ndk-bundle/build/cmake/android.toolchain.cmake
-DANDROID_NATIVE_API_LEVEL=23
-DANDROID_TOOLCHAIN=clang
jvmArgs : 
Build arg
 

構建參數

下表突出重點CMake的構建參數為Android。對於您可以設定標准構建參數列表cmake命令行可執行文件,看CMake的手冊

構建參數 描述
-G <build-system>

構建類型文件的CMake生成。

對於Android Studio中使用本地代碼項目,<build-system> 設置為Android Gradle - Ninja此設置表示CMake的使用gradle 連同ninjia構建系統編譯和鏈接C / C ++源代碼為您的應用程序。

如果<build-system>沒有指定,CMake的默認使用make構建系統。

-DANDROID_ABI <abi>

目標ABI。

NDK的支持一組的ABI的,如描述ABI管理此選項類似於 APP_ABI該變量ndk-build工具使用。

默認情況下,gradle構建你的本地庫為單獨.so 為NDK支持,在ABI的文件,然后將它們全部打包到您的APK。如果你想grudle建立僅適用於特定ABI的配置,按照說明添加C和C ++代碼到你的項目

如果沒有指定的目標ABI,CMake的默認使用 armeabi-v7a

有效的目標名稱是:

  • armeabi:基於結構ARMv5TE CPU與軟件浮點運算。
  • armeabi-v7a:與硬件FPU指令(VFPv3_D16)ARMv7的基礎的設備。
  • armeabi-v7a with NEON:同armeabi-V7A,但啟用NEON浮點指令。這相當於設置 -DANDROID_ABI=armeabi-v7a-DANDROID_ARM_NEON=ON
  • arm64-v8a:ARMv8 AArch64指令集。
  • mips:MIPS32指令集(R1)。
  • mips64 - MIPS64指令集(R6)。
  • x86:IA-32指令集。
  • x86_64 - 指令為x86-64架構設置。
-DANDROID_NDK <path> 絕對路徑到你的主機上安裝NDK的根目錄。
-DCMAKE_LIBRARY_OUTPUT_DIRECTORY <path> 位置主機CMake的地方放上 LIBRARY的目標文件時所建。
-DCMAKE_BUILD_TYPE <type> 類似於構建類型的NDK-nuild 工具。有效值為ReleaseDebug。為了簡化調試,CMake的不帶的Release或Debug版本作為構建的一部分。然而,gradle當它們打包在APK條二進制文件。
-DCMAKE_MAKE_PROGRAM <program-name> 工具來啟動本地構建系統。您可以設置值是可執行文件或工具名稱的完整路徑,如果它在PATH對於交叉編譯采用Android Studio中,這個值被設置為CMake的 ninja與Android SDK捆綁發生器。
-DCMAKE_TOOLCHAIN_FILE <path> 路徑android.toolchain.cmake是CMake的使用進行交叉編譯的Android文件。通常情況下,該文件位於 $NDK/build/cmake/目錄中,其中$NDK是你的主機上的NDK安裝目錄。有關工具鏈文件的詳細信息,請參閱交叉編譯的Android
-DANDROID_NATIVE_API_LEVEL <level> 這CMake的編譯為Android API級別。
-DANDROID_TOOLCHAIN <type> 該CMake的使用編譯器工具鏈。有效值為 clang(默認)和gcc(不推薦)。

在搖籃使用cmake變量


一旦你g到您的CMake的項目,您可以配置更改的CMake構建您的本機庫的方式一定NDK特定的變量。若要從模塊級的參數傳遞給CMake的build.gradle文件中,使用下面的DSL:

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 {...}
  }
}

 

  

下表描述了一些你可以使用CMake的與NDK時配置變量。

變量名 參數 描述
ANDROID_TOOLCHAIN
  • gcc
  • clang (默認)

指定編譯器工具鏈的CMake應該使用。

ANDROID_PLATFORM

有關平台名稱和相應的Android系統映像的完整列表,請參閱的Android NDK Native API解決方案

指定目標Android平台的名稱。例如, android-18指定的Android 4.3(API級18)。而不是直接改變這個標志的,應設置 minSdkVersion在酒店defaultConfig 或productFlavors您的塊 模塊級build.gradle文件。這可以確保你的庫由安裝在運行Android的充分版本設備的應用程序才能使用。CMake的工具鏈,然后選擇你要使用以下邏輯建立ABI的最佳平台版本:

  1. 如果存在的ABI等於一個平台版本minSdkVersion,CMake的使用該版本。
  2. 否則,如果存在低於平台版本 minSdkVersion的ABI,CMake的使用最高的平台版本。這是一個合理的選擇,因為缺少平台版本通常意味着有自上次可用的版本沒有更改本地平台的API。
  3. 否則,CMake的使用高於下一個可用的平台版本minSdkVersion
ANDROID_STL

有關選項的完整列表,請助手運行時

默認情況下,CMake的使用gnustl_static

指定STL的CMake應該使用。

ANDROID_PIE
  • ON(默認時ANDROID_PLATFORM = android-16和更高)
  • OFF(默認時ANDROID_PLATFORM = android-15,下)

指定是否使用與位置無關的可執行文件(PIE)。Android的動態鏈接器支持在Android 4.1(API級別16)和較高的PIE。

ANDROID_CPP_FEATURES

這個變量默認為空。然而,以下是你可以傳遞參數的幾個例子:

  • rtti (表明你的代碼使用RTTI)
  • exceptions (表明您的代碼使用C ++異常)

指定某些C ++功能CMake的需要編譯你的本地庫,如RTTI(運行時類型信息)和C ++異常時使用。

ANDROID_ALLOW_UNDEFINED_SYMBOLS
  • TRUE
  • FALSE (默認)

指定是否如果CMake的遇到不確定的參考,同時建立你的本地庫拋出一個未定義的符號錯誤。要禁用這些類型的錯誤,把這個變量設為 TRUE

ANDROID_ARM_MODE
  • arm
  • thumb (默認)

指定是否生成在ARM目標二進制文件arm 或thumb模式。thumb模式下,每個指令是16個位寬,並與在所述STL庫鏈接 thumb/的目錄。arm告訴CMake的生成32位ARM模式庫中的目標文件。

ANDROID_ARM_NEON
  • TRUE
  • FALSE (默認)

指定的CMake是否應該建立自己的與NEON支持本機庫。

ANDROID_DISABLE_NO_EXECUTE
  • TRUE
  • FALSE (默認)

指定是否啟用NXbit,或不能執行,安全功能。要禁用此功能,通過 TRUE

ANDROID_DISABLE_RELRO
  • TRUE
  • FALSE (默認)

指定是否啟用只讀搬遷。

ANDROID_DISABLE_FORMAT_STRING_CHECKS
  • TRUE
  • FALSE (默認)

指定是否編譯格式字符串保護你的源代碼。當啟用時,如果一個非恆定的格式字符串在所使用的編譯器會引發錯誤printf樣式的功能。

報告問題


如果碰上的是不是由於cmake的開源版本的任何問題,通過報告這些android-ndk/ndk GitHub上的問題跟蹤器。

 https://developer.android.com/ndk/guides/cmake.html

原文

https://developer.android.com/ndk/guides/cmake.html#variables


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM