我有一个android项目,build.gradle看起来像这样:
android {
compileSdkVersion 25
buildToolsVersion "25.0.0"
defaultConfig {
applicationId "com.example.test"
minSdkVersion 24
targetSdkVersion 25
versionCode 1
versionName "1.0"
ndk {
// Specifies the ABI configurations of your native
// libraries Gradle should build and package with your APK.
abiFilters 'armeabi-v7a'
}
externalNativeBuild {
ndkBuild {
targets "test_app"
}
}
}
buildTypes {
release {
minifyEnabled false
useProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
productFlavors {
general {
externalNativeBuild {
ndkBuild {
arguments "LOCAL_CFLAGS+=-std=c++11"
arguments "LOCAL_CFLAGS+=-DMODE_GENERAL"
}
}
}
full {
externalNativeBuild {
ndkBuild {
arguments "LOCAL_CFLAGS+=-std=c++11"
arguments "LOCAL_CFLAGS+=-DMODE_FULL"
}
}
}
}
externalNativeBuild {
ndkBuild {
path 'src/main/cpp/Android.mk'
}
}
}
path 'src/main/cpp/Android.mk'
中的我的Android.mk已经包含LOCAL_CFLAGS += -std=c++11
,如果我没有任何产品口味,它就可以正常运行。但是,如果我确实有产品口味,那么我必须包含arguments "LOCAL_CFLAGS+=-std=c++11"
来构建它。我想知道是否有任何方法可以避免这种情况,因为我认为我只需要包含Android.mk
中未提及的额外参数。
答案 0 :(得分:3)
问题行为的根本原因不是gradle,而是在make的命令行上设置LOCAL_CFLAGS
(make变量)。 gnu的规则在 ndk-build 的引擎下运行,声明这会“锁定”变量,而你在makefile中设置的任何内容都没有效果。 Make引入了一个特殊的override
directive,但它不能用于LOCAL_CFLAGS
的ndk-build。
您不应该从本地模块外部覆盖LOCAL_CFLAGS
;您应该在Application.mk中使用APP_CFLAGS
或 ndk-build 命令行参数。
设置(whatever)_CFLAGS=-std=c++11
不是一个好主意,因为这些标志将被传递给C ++和C编译器。此设置属于LOCAL_CPPFLAGS
和她的亲属。
使用gradle插件,您可以使用 cFlags 和 cppFlags ,如official doc所示 - 优于通用参数,例如:
productFlavors {
full {
externalNativeBuild {
ndkBuild {
cFlags "-DMODE_FULL"
cppFlags "-fexceptions"
}
}
}
}