[√]build.gradle,mk,c++预处理宏联动关系

简介: [√]build.gradle,mk,c++预处理宏联动关系

我想要在gradle中增加一个宏传递给c++,实现打开关闭c++的模块功能。

mk文件中定义宏

LOCAL_CFLAGS、LOCAL_EXPORT_CFLAGS 有区别,注意区分。

image.png

LOCAL_EXPORT_CFLAGS 是一个变量,用于在 Android 的构建系统中指定要导出的 C/C++ 标志。当一个模块(module)使用该变量设置了一些标志后,这些标志会被传递给依赖于该模块的其他模块。

在 Android 的构建系统中,每个模块都被视为一个相对独立的单元,模块之间可以相互依赖。这些模块可以是应用程序、库或模块化组件等。当一个模块依赖于另一个模块时,它需要知道被依赖模块的编译标志,以便正确地进行编译和链接。

通过使用 LOCAL_EXPORT_CFLAGS 变量,你可以将一些特定的 C/C++ 编译标志从当前模块导出,使其可用于依赖于当前模块的其他模块。

例如,在一个库模块的 Android.mk 文件中,你可以这样设置 LOCAL_EXPORT_CFLAGS 变量:

LOCAL_EXPORT_CFLAGS := -DDEBUG_MODE -I$(LOCAL_PATH)/include
LOCAL_CFLAGS += -DUSE_LEAK_TRACER=$(USE_LEAK_TRACER) # USE_LEAK_TRACER来自gradle

-DDEBUG_MODE 标志和 -I$(LOCAL_PATH)/include 标志导出到其他依赖于该库模块的模块中。这些标志可以用来启用调试模式,并指定包含文件的搜索路径。

当其他模块(如应用程序或其他库)依赖于这个库模块时,它们可以自动继承 LOCAL_EXPORT_CFLAGS 变量中的这些标志。这样,它们就可以使用这些标志来进行编译和链接。

-D 是一个编译器选项,用于定义预处理器宏(Preprocessor Macro)。

gradle中配置开关

在build.gradle中定义预处理宏

android{
    buildTypes{
        debug{
            buildConfigField("int", "USE_LEAKTRACE", "1") # 这个是给java使用的
            externalNativeBuild {
                ndkBuild {
                    arguments 'NDK_DEBUG=1', 'USE_LEAK_TRACER=1' # CPP发现在这里有效
                }
            }
        }
    }
}

如果报错Could not find method buildConfigField() for arguments [USE_LEAKTRACE] on BuildType_Decorated...,是因为buildConfigFiled参数填错导致的

每次构建过程中都会自动生成 BuildConfig.java 文件(位于 build/generated/source/buildConfig/{buildType}/{flavor} 目录下),其中包含了您在 build.gradle 文件中使用 buildConfigField 定义的字段。

使用反射获取正确的BuildConfigConfig

String buildConfigName = getPackageName() + ".BuildConfig";
try {
    Class<BuildConfig> buildConfigClass = (Class<BuildConfig>) Class.forName(buildConfigName);
    // 获取到gradle中配置的字段值
    Field field = buildConfigClass.getField("USE_LEAK_TRACER");
    int useLeakTracer = field.getInt(null);
    if (useLeakTracer > 0) {
        Log.d("initLeakTracer", "use leak tracer");
        LeakNotify.getInstance().show(this);
    }
} catch (ClassNotFoundException e) {
    e.printStackTrace();
} catch (NoSuchFieldException e) {
    e.printStackTrace();
} catch (IllegalAccessException e) {
    e.printStackTrace();
}

gradle中变量直接+即可

/**
 * Adds a new field to the generated BuildConfig class.
 *
 * <p>The field is generated as: {@code <type> <name> = <value>;}
 *
 * <p>This means each of these must have valid Java content. If the type is a String, then the
 * value should include quotes.
 *
 * @param type the type of the field
 * @param name the name of the field
 * @param value the value of the field
 */
public void buildConfigField(
        @NonNull String type,
        @NonNull String name,
        @NonNull String value) {
    ClassField alreadyPresent = getBuildConfigFields().get(name);
    if (alreadyPresent != null) {
        String message =
                String.format(
                        "BuildType(%s): buildConfigField '%s' value is being replaced: %s -> %s",
                        getName(), name, alreadyPresent.getValue(), value);
        errorReporter.handleSyncWarning(null, SyncIssue.TYPE_GENERIC, message);
    }
    addBuildConfigField(new ClassFieldImpl(type, name, value));
}

在mk文件中使用info打印log

$(info "log") # 注意空格问题,mk要求比较严格
目录
相关文章
|
2月前
|
编译器 Linux C++
【C++ 跨平台开发 】掌握 C++ 跨平台关键宏的使用
【C++ 跨平台开发 】掌握 C++ 跨平台关键宏的使用
72 3
|
2月前
|
存储 缓存 安全
【cmake 生成配置文件】CMake与现代C++:配置文件宏的深度探索与应用
【cmake 生成配置文件】CMake与现代C++:配置文件宏的深度探索与应用
112 0
|
2月前
|
编译器 程序员 Linux
C++系列九:预处理功能
C++系列九:预处理功能
|
2月前
|
存储 SQL 数据库
C++ Qt开发:数据库与TableView多组件联动
在Qt中,通常我们不会在`TableView`等组件中保存数据,一般会将这些数据存储至数据库或者是文件中保存,当使用时则动态的在数据库中调出来,以下案例将实现,当用户点击并选中`TableView`组件内的某一行时,我们通过该行中的`name`字段查询,并将查询结果关联到`ListView`组件内,同时将`TableView`中选中行的字段分别显示在窗体底部的`LineEdit`编辑框内。Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍`TableView`
57 1
C++ Qt开发:数据库与TableView多组件联动
|
2月前
|
SQL 数据库 C++
C++ Qt开发:Charts与数据库组件联动
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍`Charts`组件与`QSql`数据库组件的常用方法及灵活运用。在之前的文章中详细介绍了关于`QCharts`绘图组件的使用方式,本章将继续延续这个知识点,通过使用`QSql`数据库模块动态的读取某一个时间节点上的数据,当用户点击查询数据时则动态的输出该事件节点的所有数据,并将数据绘制到图形组件内,实现动态查询图形的功能。
48 0
C++ Qt开发:Charts与数据库组件联动
|
2月前
|
存储 C++ 索引
C++ Qt开发:TableView与TreeView组件联动
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍`TableView`与`TreeView`组件联动的常用方法及灵活运用。 本章我们继续实现表格的联动效果,当读者点击`TableView`或`TreeView`中的某一行时,我们让其实现自动跟随功能,且当用户修改行中特定数据时也让其动态的跟随改变,首先绘制一个主界面如图,分别放置两个组件框,底部保留两个按钮,按钮1用于该表表格的行列个数,按钮2则用于设置`TableView`表格表头参数,整个表格我们将其设
45 0
C++ Qt开发:TableView与TreeView组件联动
|
2月前
|
安全 编译器 C语言
【C++ 编译器 版本支持】深度解读C++ 版本以及编译器版本相关宏
【C++ 编译器 版本支持】深度解读C++ 版本以及编译器版本相关宏
86 0
|
2月前
|
编译器 C语言 C++
深入探索C/C++预处理世界:预定义符号与宏定义的全方位指南
深入探索C/C++预处理世界:预定义符号与宏定义的全方位指南
|
2月前
|
机器学习/深度学习 人工智能 编解码
极智AI | 教你用C++实现一般模型推理图片预处理模块
大家好,我是极智视界,本文介绍了用 C++ 实现一般模型推理图片预处理的方法,通用性较强。
180 0
|
9月前
|
C# C++
C++ 利于宏模拟C#的正则表达式
C++ 利于宏模拟C#的正则表达式