热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何在gradle中的构建类型内为本机代码定义宏?

如何解决《如何在gradle中的构建类型内为本机代码定义宏?》经验,请帮忙看看怎么搞?

我已经在Android Studio中使用本地代码构建了一个库。它有一些与时间相关的部分(在C中),这些部分必须处于一定的延迟水平下,我需要对其进行度量。因此,我已经实现了一些测量例程。但是,我不希望测量例程在版本编译中起作用。

因此,我定义了宏,这些宏将允许我根据构建类型进行编译或不进行代码编写:

在我的本机代码中:

#ifdef MEASURE
measureRoutine1();
if (MEASURE == 1) {
    measureRoutine2();
}
#endif

在我的gradle文件中:

buildTypes {
        release {
            signingConfig signingConfigs.storeSignature
            debuggable false
            jniDebuggable false
            versionNameSuffix "2.3"
            shrinkResources true
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            jniDebuggable true
            minifyEnabled false
            versionNameSuffix '2.3.1'
        }
        measure1 {
            initWith debug
            externalNativeBuild {
                cmake {
                    cppFlags += "-DMEASURE=0"
                    cFlags += "-DMEASURE=0"
                }
            }
        }
        measure2 {
            initWith debug
            externalNativeBuild {
                cmake {
                    cppFlags += "-DMEASURE=1"
                    cFlags += "-DMEASURE=1"
                }
            }
        }
    }

现在,我的问题是我编译的buildType无关紧要,在我的本机代码中未定义MEASURE标志,因此永远不会编译测量代码。

我究竟做错了什么?我怎样才能达到我所需要的?

PS:我要在本机中定义MEASURE宏的唯一方法是将cFlags放在buildConfigs之外的defaultConfig空间中。下面的代码可以工作,但是每次我要编译测量值时,我都需要对MEASURE宏进行硬编码。

defaultConfig {
        minSdkVersion 21
        targetSdkVersion 25
        versionCode 6
        versionName "2.3"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                cppFlags "-std=c++11 -fexceptions -O2 -ffast-math -DMEASURE=0"
                cFlags "-O2 -ffast-math -DMEASURE=0"
            }
        }
    }

更新1:

如果我在buildType发行版下定义了MEASURE宏(仅在发行版下,或者在发行版和调试下都定义),那么该宏将显示在本机代码中,并且在发行版中定义了de value。似乎它只是未在调试构建类型下定义。对可能发生的事情有任何想法吗?

我正在使用具有最新稳定更新的Android Studio 2.3.3。另外,我创建了一个新的测试项目,以检查我的旧项目是否有错误,但是两者都相同。

更新2:

我开始认为,也许Android Studio无法构建正确的buildType。另一个有趣的事情发生了,我尝试在debug buildType内为java定义一个布尔值生成配置字段,即使自动生成的BuildConfig.java将该字段设置为true,在执行调试时我仍然得到一个错误,该变量不存在(除非我将变量放在发布buildType下)。因此,无论我在构建变体中选择什么,它看起来总是在构建发行版本类型。

这是我完整的测试项目构建过程:

apply plugin: 'com.android.library'

android {
    compileSdkVersion 25
    buildToolsVersion "26.0.0"

    defaultConfig {
        minSdkVersion 21
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            minifyEnabled false
            versionNameSuffix '2.3.1'
            externalNativeBuild {
                cmake {
                    cppFlags += "-DMEASURE=0"
                    cFlags += "-DMEASURE=0"
                }
            }
            buildConfigField "Boolean", "DEBUG_MODE", "Boolean.parseBoolean(\"true\")"
        }    
    }

    externalNativeBuild {
        cmake {
            path 'src/main/cpp/CMakeLists.txt'
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.3.1'
    testCompile 'junit:junit:4.12'
}

这是自动生成的BuildConfig.java文件:

public final class BuildConfig {
  public static final boolean DEBUG = Boolean.parseBoolean("true");
  public static final String APPLICATION_ID = "com.company.TestApp";
  public static final String BUILD_TYPE = "debug";
  public static final String FLAVOR = "";
  public static final int VERSION_CODE = 1;
  public static final String VERSION_NAME = "1.02.3.1";
  // Fields from build type: debug
  public static final Boolean DEBUG_MODE = Boolean.parseBoolean("true");
}

这是我在代码中使用BuildConfig.DEBUG_MODE时在执行时遇到的错误:

Error:(14, 27) error: cannot find symbol variable DEBUG_MODE

可能会发生什么?


推荐阅读
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了brain的意思、读音、翻译、用法、发音、词组、同反义词等内容,以及脑新东方在线英语词典的相关信息。还包括了brain的词汇搭配、形容词和名词的用法,以及与brain相关的短语和词组。此外,还介绍了与brain相关的医学术语和智囊团等相关内容。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
author-avatar
求学者
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有