在做 C++ 需求开发时经常会遇到用宏定义来区分不同版本、不同平台的功能,如下所示:
#ifdef DEBUG // 调用 debug 版本方法 #elif RELEASE // 调用 release 版本方法 #endif
在 debug 和 release 版本对应的方法是不一样的,所以要用宏来隔开。
那么问题来了,这个宏定义参数是如何传递过来的?
下面会介绍两种方式来传递宏定义参数:
gradle 中传递宏参数gradle 中传递宏参数直接在 build.gradle 中定义就行,如下所示:
externalNativeBuild {
cmake {
cppFlags '-std=c++14','-DCUSTOM_MACRO=1'
}
}
定义了宏 CUSTOM_MACRO ,并且值为 1 ,由于宏定义主要是作为开关使用的,所以它的值一般不是 0 就 1 。
另外要注意宏定义的语法,在宏定义前面要加大写符号 D ,还有一个横线 - 符号别忘了。
具体使用如下代码所示:
#ifdef CUSTOM_MACRO hello = "Hello from Custom Macro"; #endifcmake 中定义宏参数
另一种方式直接在 CMakeLists.txt 文件中去定义宏参数。
借助 CMake 的 add_definitions 方法可以定义宏,同时也可以使用 remove_definitions 方法去取消宏定义。
代码如下所示:
add_definitions(-DCMAKE_DEFINITIONS=1) // 取消宏定义 // remove_definitions(-DCMAKE_DEFINITIONS=1)
在 C++ 也可以直接使用这个宏:
#ifdef CMAKE_DEFINITIONS hello = "Hello from CMake Definitions"; #endif小结
以上就是 CMake 编译传递宏定义参数的两种方式,简单而又使用的小技巧。
更多 NDK 开发内容欢迎观看我录制的免费慕课网视频:
推荐我录制的免费 Android NDK 进阶视频
更多技术文章欢迎阅读:
Android JNI 基础知识
Android JNI 数组操作
Android 通过 JNI 访问 Java 字段和方法调用
Android 通过 JNI 调用 Java 类的构造方法和父类的方法
Android JNI 调用时缓存字段和方法 ID
Android JNI 中的引用管理
Android JNI 调用时的异常处理
Android JNI 中的线程操作
Android JNI 之 Bitmap 操作
技术交流,欢迎加我微信:ezglumes ,拉你入技术交流群。
推荐阅读:
音视频面试基础题
OpenGL ES 学习资源分享
开通专辑 | 细数那些年写过的技术文章专辑
NDK 学习进阶免费视频来了
推荐几个堪称教科书级别的 Android 音视频入门项目
觉得不错,点个在看呗~



