前言

CMake 是一个高效的C/C++ 代码(包括 JNI 开发)编译工具,而CMake 的使用,作为开发者最关心的就是如何编写 CMakeLists.txt 。今天就以Android studio这个开发工具为例,详细介绍一下如何在Android studio这个开发工具中使用CMake。首先需要了解一下如何在 gradle文件中配置这些参数。

gradle中常用配置参数

首先我们需要在项目的根目录的build.gradle这个文件中添加先关的配置以及CMakeLists.txt 文件的路径。如下所示:

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'org.greenrobot.greendao'
apply plugin: 'kotlin-kapt'android {defaultConfig {        externalNativeBuild {//cmake 的参数配置入口cmake {// 指定一些编译选项cppFlags "-std=c++11 -frtti -fexceptions"//如何向变量传递参数,对应的格式如下(arguments "-D变量名=参数")arguments '-DANDROID_PLATFORM=android-24', '-DANDROID_STL=c++_static', '-DANDROID_STL=c++_shared'// 也可以使用下面这种语法向每个变量传递多个参数(参数之间使用空格隔开),格式如下// arguments "-D变量名=参数1 参数2"arguments  "-DANDROID_CPP_FEATURES=rtti exceptions"}}ndk {moduleName "bndLPRNcnnJniLog"ldLibs "log", "z", "m"// 指定ABI对应的ARM架构abiFilters "armeabi-v7a", "arm64-v8a"}}buildTypes {.......}externalNativeBuild {cmake {//CMakeLists.txt文件的路径path "src/main/cpp/CMakeLists.txt"//指定Cmake的版本version "3.10.2"}}sourceSets {main {jniLibs.srcDirs = ['libs']           }}repositories {flatDir {dirs 'libs'}}}dependencies {//省略.......
}

CMake 编译 NDK 所支持的变量配置

变量名称 参数 参数说明
ANDROID_TOOLCHAIN clang (default) gcc (deprecated) 指定 Cmake 编译时所使用的工具链。支持gcc和clang俩种工具链,默认使用clang.使用示例:arguments “-DANDROID_TOOLCHAIN=clang”
ANDROID_PLATFORM Android对应的API版本 指定 NDK 所用的安卓的版本是多少。使用示例:arguments "-DANDROID_PLATFORM=android-21
ANDROID_STL gnustl_static(default)(详细见下面的c++库附表) 指定 Cmake 编译所使用的标准模版库。使用示例:arguments “-DANDROID_STL=gnustl_static”
ANDROID_PIE ON (android-16 以上默认为 ON)OFF (android-15 以下默认为 OFF) 使得编译的 elf 文件可以加载到内存中的任意位置就叫 pie(position independent executables),出于安全保护,在 Android 4.4 之后可执行文件必须是采用PIE编译。使用示例:arguments “-DANDROID_PIE=ON”
ANDROID_CPP_FEATURES 1:空(default) 2:RTTI(支持 RTTI) 3:exceptions(支持 C++ 异常) 指定是否需要支持 RTTI(RunTime Type Information)和 C++ 的异常,默认为空, 使用示例:arguments “-DANDROID_CPP_FEATURES=rtti exceptions”
ANDROID_ALLOW_UNDEFINED_SYMBOLS TRUE 或者FALSE(默认为FALSE) 指定在编译时,如果遇到未定义的引用时是否抛出错误。如果要允许这些类型的错误,请将该变量设置为 TRUE。使用示例:arguments “-DANDROID_ALLOW_UNDEFINED_SYMBOLS=TRUE”
ANDROID_ARM_MODE 1:arm 2:thumb (default) 如果是 thumb 模式,每条指令的宽度是 16 位,如果是 arm 模式,每条指令的宽度是 32 位。使用示例:arguments “-DANDROID_ARM_MODE=arm”
ANDROID_ARM_NEON TRUE 或者FALSE(default) 指定在编译时,是否使用 NEON 对代码进行优化。NEON 只适用于 armeabi-v7a 和 x86 ABI,且并非所有基于 ARMv7 的 Android 设备都支持 NEON,但支持的设备可能会因其支持标量/矢量指令而明显受益。使用示例:arguments “-DANDROID_ARM_NEON=TRUE”
ANDROID_DISABLE_NO_EXECUTE TRUE 或者FALSE(default) 指定在编译时是否启动 NX(No eXecute)。NX 是一种应用于 CPU 的技术,帮助防止大多数恶意程序的攻击。如果要禁用 NX,请将该变量设置为 TRUE。使用示例:arguments “-DANDROID_DISABLE_NO_EXECUTE=TRUE”
ANDROID_DISABLE_RELRO TRUE 或者 FALSE(default) RELocation Read-Only (RELRO) 重定位只读,它能够保护库函数的调用不受攻击者重定向的影响。如果要禁用 RELRO,请将该变量设置为 TRUE。使用示例:arguments “-DANDROID_DISABLE_RELRO=FALSE”
ANDROID_DISABLE_FORMAT_STRING_CHECKS TRUE或者FALSE(default) 在类似 printf 的方法中使用非常量格式字符串时是否抛出错误。如果为 TRUE,即不检查字符串格式。使用示例:arguments “-DANDROID_DISABLE_FORMAT_STRING_CHECKS=FALSE”

C++ 库支持

变量名称 使用说明 功能
libstdc++ 默认最小系统 C++ 运行时库 不推荐设置
gabi++_static GAbi++ 运行时(静态) C++ 异常和 RTTI
gabi++_shared GAbi++ 运行时(共享) C++ 异常和 RTTI
stlport_static STLport 运行时(静态) C++ 异常和 RTTI;标准库
stlport_shared STLport 运行时(共享) C++ 异常和 RTTI;标准库
gnustl_static GNU STL(静态) C++ 异常和 RTTI;标准库
gnustl_shared GNU STL(共享) C++ 异常和 RTTI;标准库
c++_static LLVM libc++ 运行时(静态) C++ 异常和 RTTI;标准库
c++_shared LLVM libc++ 运行时(共享) C++ 异常和 RTTI;标准库

C++ 库官网支持参考链接

推荐博文

关于cmake的知识有好多,这里推荐一个比较的博主,里面详细讲解了NDK开发先关知识。

  • Android NDK 从入门到精通(汇总篇)

Cmake参数详细介绍相关推荐

  1. deepin系统使用ifconfig -a 输出参数详细介绍

    deepin系统使用ifconfig -a 输出参数详细介绍 xys@xys-PC:~$ ifconfig -a enp4s0: flags=4163<UP,BROADCAST,RUNNING, ...

  2. bowtie 加mn标签_Bowtie2使用方法与参数详细介绍 - Public Library of Bioinformatics

    Bowtie2 使用方法与参数详细介绍 - Public Library of Bioinformatics 懒人必看 Bowtie2 -q --phred33 --sensitive --end-t ...

  3. 一加9手机参数详细介绍,价格是多少

    在3月24日下午.一加科技在上海发布了一加 9 和一加 9 Pro 两款手机.手机一经发布就受到了不少用户的关注.但这部手机究竟怎么样呢?换换就给大家做了详细介绍.一起来看看吧! 一加9手机价格 一加 ...

  4. Jquery中AJAX参数详细介绍

    转载:http://www.cnblogs.com/qiufuwu618/archive/2012/12/20/2826190.html Jquery中AJAX参数详细列表: 参数名 类型 描述 ur ...

  5. 监控摄像头参数详细介绍

    一.不可小瞧的镜头 镜头是摄像机的眼睛,为了适应不同的监控环境和要求,需要配置不同规格的镜头.比如在室内的重点监视,要进行清晰且大视场角度的图像捕捉,得配置广角镜头:在室外的停车场,既要看到停车场全貌 ...

  6. x264编码参数详细介绍

    说明 下载:https://www.videolan.org/developers/x264.html 一款遵循h264标准的开源视频编码器: 具体参数介绍 –profile  支持特定的编码功能,每 ...

  7. bowtie 加mn标签_Bowtie2使用方法与参数详细介绍 | Public Library of Bioinformatics

    懒人必看 Bowtie2 -q --phred33 --sensitive --end-to-end -I 0 -X 500 --fr --un unpaired --al aligned --un- ...

  8. bowtie 加mn标签_Bowtie2使用方法与参数详细介绍

    懒人必看Bowtie2 -q --phred33 --sensitive --end-to-end -I 0 -X 500 --fr --un unpaired --al aligned \ --un ...

  9. 运放的主要参数详细介绍

    1. 引言 运放的作用是调节和放大模拟信号,它是用途十分广泛的器件,接入适当的反馈网络,可用作精密的交流和直流放大器.有源滤波器滤波器.振荡器振荡器及电压比较器.其应用领域包括但不限制通讯.电子.汽车 ...

最新文章

  1. iOS高级面试之NSRunLoop须知
  2. IE下 c00ce56e 错误竟然是nginx 字符设置的问题
  3. 十一届蓝桥杯国赛 玩具蛇-dfs
  4. c++返回指针时候注意提防_编写干净的测试–提防魔术
  5. Android 底部上拉抽屉view
  6. 甜甜圈和拓扑学也有关系,你想的到吗?
  7. 摘抄和总结--确保搞砸人工智能项目的十种方法
  8. java调用数据库的基本步骤_Java实现数据库操作的基本流程(转)
  9. 新鲜出炉的canvas~
  10. java文本框内容覆盖6_java中读入一个TXT文件到文本框空如何覆盖以前读的内容?...
  11. 通达信 移动平均算法_涨停板这样选!首次公开通达信超级选股法使用流程(建议收藏)...
  12. Windows10 添加打印机
  13. 怎么制作你的第一个机器人
  14. 只是浅谈MS SQL Server的Page Splits运作原理
  15. 【思考】冷启动、种子用户的获取和激活
  16. 金山病毒库自定义服务器,将金山毒霸10全功能版本(带离线病毒库)安装到离线电脑,操作方法!!!亲测可用...-爱毒霸交流论坛...
  17. 用Photoshop制作1寸和2寸的照片
  18. Linux目录文件操作命令篇--(工作常用命令的深度使用,小白必收藏)
  19. 什么是 CDP 和 LLDP?
  20. MySQL主从部署, master and slave have equal MySQL server UUIDs问题解决

热门文章

  1. 10行Python代码搞定目标检测
  2. Links about 技术大牛Joseph Yiu ...姚文祥(Joseph Yiu)
  3. 随笔 - Andriod
  4. 廖雪峰介绍Node.js
  5. 基于SSLStrip的HTTPS会话劫持
  6. 给安利公司董事长郑李锦芬女士的一封信
  7. 线性独立路径_设计一个线性电源电路,需要准备哪些元器件呢?
  8. iPhone 14系列贴膜曝光:将采用开孔屏方案 四边框极窄
  9. 宁德时代:被美国制裁、与特斯拉谈崩等系谣言 已向公安机关报案
  10. 又一腾讯应用将停运!企业QQ将于2022年1月31日关闭