Gradle似乎在添加产品风格时覆盖了ndk构建参数

时间:2017-05-24 21:52:25

标签: android gradle android-ndk android-gradle

我有一个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中未提及的额外参数。

1 个答案:

答案 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"
      }
    }
  }
}