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

cmake中文帮助文档的更多相关文章

  1. DecimalFormat 中的 # 与 0 的区别(中文帮助文档中翻译可能是错误的)

    想对数字进行格式化的时候,可能会使用到 java.text.DecimalFormat 类.中文帮助文档中,有如下符号 位置 本地化 含义 0 数字 是 阿拉伯数字 # 数字 是 阿拉伯数字,如果不存 ...

  2. 强大的矢量图形库:Raphael JS 中文帮助文档及教程

    Raphael 是一个用于在网页中绘制矢量图形的 Javascript 库.它使用 SVG W3C 推荐标准和 VML 作为创建图形的基础,你可以通过 JavaScript 操作 DOM 来轻松创建出 ...

  3. vim中文帮助文档安装

    vim自带的帮助手册是英文的, 对平时编程的人来说没有多大阅读困难,在何况还有"星级译王"呢, 但是我猜和我一样连英语四级都愁的大有人,可偏偏就有一帮好心人人将其翻译成了中文, 可 ...

  4. 【译】StackExchange.Redis中文使用文档

    StackExchange.Redis中文使用文档 Intro 最近想深入学习一些 Redis 相关的东西.于是看了看官方的项目StackExchange.Redis,发现里面有一份文档,于是打算翻译 ...

  5. StackExchange.Redis中文使用文档

    StackExchange.Redis中文使用文档 Intro 最近想深入学习一些 Redis 相关的东西.于是看了看官方的项目 StackExchange,发现里面有一份文档,于是打算翻译成中文,方 ...

  6. Entity Framework Core 中文入门文档

    点击链接查看文档: Entity Framework Core 中文入门文档

  7. django 中文入门文档

    django中文入门文档:阅读地址

  8. [No0000190]vim8安装教程和vim中文帮助文档Vimcdoc安装方法-Vim使用技巧(5)

    Vim8.0是近十年来的一次大更新,支持任务.异步I/O.Channels和JSON以及异步计时器.Lambdas 和 Closures等,还包括对GTK + 3的支持.由于ubuntu默认安装的Vi ...

  9. Plupload上传插件中文帮助文档

    Plupload上传插件中文帮助文档 配置参数 实例化一个plupload对象时,也就是 new plupload.Uploader(),需要传入一个对象作为配置参数.后面内容中出现的plupload ...

随机推荐

  1. auto和register关键字

    关键字概述 很多朋友看到这儿可能会有疑问,往往其它讲C语言的书籍都是从HelloWorld,数据类型开始C语言学习的,为什么我们要从C语言的关键字开始呢?关于这点,我有两点需要说明: 本章节面向的读者 ...

  2. <超越死亡:恩宠与勇气>节选

    我有一副身体,但我并非自己的身体.我可以看见并感觉到我的身体,然而凡是可以被看见以及被感觉到的,并不是真正的观者.我的身体也许疲惫或兴奋,生病或健康,沉重或轻松,也可能焦虑或平静,但这与内在的真我全然 ...

  3. C++中四种强制类型转换区别详解

    C++即支持C风格的类型转换,又有自己风格的类型转换.C风格的转换格式很简单,但是有不少缺点的: 1.转换太过随意,可以在任意类型之间转换.你可以把一个指向const对象的指针转换成指向非const对 ...

  4. 【Arcgis android】 离线编辑实现及一些代码段

    Arcgis android 离线编辑实现及一些代码段 底图添加 private String path="file:///mnt/sdcard/data/chinasimple.tpk&q ...

  5. php+mysql入门

    mysql+php+apache可以快速的架构动态网站. 首先,为什么php容易搞mysql,因为与mysql交互成为了php语言的一种特性. 一.mysql入门 mysql是一种开源的关系型数据库. ...

  6. iframe相关操作

    内容摘要 父级获取iframe中的元素 父级触发iframe中的函数 iframe触发父级元素绑定的事件 iframe触发父级函数方法 iframe触发父级元素的值 parent.html <! ...

  7. THINKPHP 框架的模板技术

    //echo C('name'); App/Action/IndexAction.class.php文件夹下的 URL模式 //输出URL模式//echo C('URL_MODEL'),'<br ...

  8. spoj Longest Common Substring

    Longest Common Substring SPOJ - LCS 题意:求两个串的最长公共子串 /* 对一个串建立后缀自动机,用另一个串上去匹配 */ #include<iostream& ...

  9. 「十二省联考 2019」皮配——dp

    题目 [题目描述] #### 题目背景一年一度的综艺节目<中国好码农>又开始了.本季度,好码农由 Yazid.Zayid.小 R.大 R 四位梦想导师坐镇,他们都将组建自己的梦想战队,并率 ...

  10. springboot整合springtask

    在使用 springmvc 中,一般的定时任务是使用 job 或者 quartz 或者timer来实现,但是使用它们的时候比较麻烦,会在 xml 文件中配置很多, springboot 的定时任务比较 ...