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. 使用bat一键打开java、jar、py文件

    直接运行jar是没有命令行窗口的,如果想有命令行窗口,一般来说是要 win+r 运行cmd,定位到所在目录,然后用命令行执行 java -jar xxx.jar 而对于python,打开py文件也是麻 ...

  2. Django框架 之 模板语言

    Django框架 之 模板语言 浏览目录 标签 过滤器 一.标签 Tags 1.普通变量 普通变量用{{ }} 变量名由数字.字母.下划线组成 点.在模板语言中用来获取对象相应的属性值 示例: 1 2 ...

  3. 图(最短路径算法————迪杰斯特拉算法和弗洛伊德算法).RP

    文转:http://blog.csdn.net/zxq2574043697/article/details/9451887 一: 最短路径算法 1. 迪杰斯特拉算法 2. 弗洛伊德算法 二: 1. 迪 ...

  4. 《Maven实战》笔记-4-生命周期和插件

    除了坐标.依赖以及仓库外,Maven另外两个核心概念是生命周期和插件. 一.生命周期 Maven的生命周期是抽象的,其本身不做任务实际的工作,实际的任务(如编译源代码)都交由插件来完成. 三套生命周期 ...

  5. Understanding the Effective Receptive Field in Deep Convolutional Neural Networks

    Understanding the Effective Receptive Field in Deep Convolutional Neural Networks 理解深度卷积神经网络中的有效感受野 ...

  6. vimrc配置-新建文件时自动生成文件头

    vimrc配置-新建文件时自动生成文件头    auto add file header autocmd BufNewFile *.py 0r /home/zxkletters/.vim/vim_te ...

  7. 在GridView控件FooterTemplate内添加记录 Ver2

    中午有发表一篇博文<在GridView控件FooterTemplate内添加记录> http://www.cnblogs.com/insus/p/3269908.html 添加铵钮是放在F ...

  8. 移动端自适应个人理解与收集——rem

    rem——更好的适配移动端.这个单位我一直想弄个究竟,今天终于看了个差不多.看了很多的博客.心中总算有自己的想法.(还有vh,vw这里我这个小白还没有弄明白就先不写了.) 1.rem可以在html,b ...

  9. Django之request对象

    在view.py的函数中.我们的函数中第一个参数都是request.在request中有一些信息,比如正在加载这个页面的用户是谁,或者是用什么浏览器之类的.这对于我们网站的管理是很有用处的. requ ...

  10. day01.2-计算机网络协议

    注:本文摘自林海峰老师的博客,作为个人学习笔记,日后方便阅读,原文详见链接www.cnblogs.com/linhaifeng/articles/5937962.html 一.  ISO协议     ...