gpt4 book ai didi

c - 如何在 gradle 中的构建类型中为 native 代码定义宏?

转载 作者:太空狗 更新时间:2023-10-29 15:08:44 24 4
gpt4 key购买 nike

我在 Android Studio 中使用 native 代码构建了一个库。它有一些时间相关的部分(在 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 标志都没有在我的 native 代码中定义,所以测量代码永远不会被编译。

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

附言:获得在 native 中定义的 MEASURE 宏的唯一方法是将 cFlags 放在 defaultConfig 空间中的 buildTypes 之外。以下代码有效,但每次我想使用测量值进行编译时,我都需要对 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 release 下定义 MEASURE 宏(仅在 release 下或同时在 release 和 debug 下),该宏出现在我的 native 代码中定义,de 值在 release 中定义。似乎它只是没有在调试构建类型下定义。对可能发生的事情有任何想法吗?

我使用的是具有最新稳定更新的 Android Studio 2.3.3。此外,我还创建了一个新的测试项目来检查我的旧项目是否存在错误,但两者的情况相同。

更新 2:

我开始认为 Android Studio 可能没有构建正确的 buildType。另一件有趣的事情正在发生,我尝试在调试 buildType 中为 java 定义一个 bool 构建配置字段,即使自动生成的 BuildConfig.java 将该字段设置为 true,但在执行调试时我得到一个错误,即变量不存在(除非我将变量放在发布 buildType 下)。所以看起来无论我在我的构建变体中选择什么,它总是构建发布构建类型。

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

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

可能会发生什么?

最佳答案

我找到了一个解决方案:

问题不在于宏的定义方式,它工作正常,问题在于 gradle。

this issue编译库时:基本上,每次您使用 make project 时,无论为它们选择了何种构建变体,“app”项目旁边的所有项目都会在其发布版本中编译。

所以在这种情况下,问题是即使我在“nativelibrary”模块的构建变体框中选择了调试,发布构建类型也会编译 + 我为“app”构建变体选择的任何内容。

解决方案:

将以下代码添加到“nativelibrary”gradle 文件中:

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

//DEFINE THE DEFAULT PUBLISH CONFIG WHICH IS RELEASE
defaultPublishConfig 'release'

//ALLOW IT TO PUBLISH A NON DEFAULT WHICH WILL BE THE DEBUG OR
//A CUSTOM BUILD TYPE
publishNonDefault true

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

}

将compile project(':nativelib')以下代码替换为app build gradle:

dependencies {

//ERASE THE FOLLOWING LINE
//compile project(':nativelib')

//ADD BUILD TYPE SPECIFIC COMPILE TYPES AND REQUEST A SPECIFIC
//CONFIGURATION FOR THE 'nativelibrary' DEPENDING ON THE
//REQUESTED BUILD TYPE.
releaseCompile project(path: ':nativelib', configuration: "release")
debugCompile project(path: ':nativelib', configuration: "debug")


compile fileTree(dir: 'libs', include: ['*.jar'])
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'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
}

这解决了我的问题,现在正在为调试创建宏。

关于c - 如何在 gradle 中的构建类型中为 native 代码定义宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44552332/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com