在做 C++ 需求开发时经常会遇到用宏定义来区分不同版本、不同平台的功能,如下所示:
#ifdef
// 调用 debug 版本方法
#elif
// 调用 release 版本方法
#endif
在 debug 和 release 版本对应的方法是不一样的,所以要用宏来隔开。
那么问题来了,这个宏定义参数是如何传递过来的?
下面会介绍两种方式来传递宏定义参数:
gradle 中传递宏参数
gradle 中传递宏参数直接在 build.gradle 中定义就行,如下所示:
externalNativeBuild {
cmake {
cppFlags '-std=c++14','-DCUSTOM_MACRO=1'
}
}
定义了宏 CUSTOM_MACRO ,并且值为 1 ,由于宏定义主要是作为开关使用的,所以它的值一般不是 0 就 1 。
另外要注意宏定义的语法,在宏定义前面要加大写符号 D ,还有一个横线 - 符号别忘了。
具体使用如下代码所示:
#ifdef
hello = "Hello from Custom Macro";
#endif
cmake 中定义宏参数
另一种方式直接在 CMakeLists.txt 文件中去定义宏参数。
借助 CMake 的 add_definitions 方法可以定义宏,同时也可以使用 remove_definitions 方法去取消宏定义。
代码如下所示:
add_definitions(-DCMAKE_DEFINITIONS=1)
// 取消宏定义
// remove_definitions(-DCMAKE_DEFINITIONS=1)
在 C++ 也可以直接使用这个宏:
#ifdef
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 操作