android NDK cflags没有为产品口味定义

时间:2018-05-08 18:34:33

标签: android android-ndk

在我的gradle文件中,我有

externalNativeBuild {
        ndkBuild {
            path 'src/main/jni/Android.mk'
        }
    }
    productFlavors {
        flavorone{
            externalNativeBuild.cmake {
                cFlags '-DFLAVORONE'
            }
            signingConfig signingConfigs.flavoronerelease

        }         
        flavortwo{
            applicationId "com.mycompany.flavortwo"
            versionCode 2
            versionName "1.0.1"
            externalNativeBuild.cmake {
                cFlags '-DFLAVORTWO'
            }
            signingConfig signingConfigs.flavortworelease
        }
        flavorthree{
            applicationId "com.mycompany.flavorthree"
            versionCode 7
            versionName "1.0.6"
            externalNativeBuild.cmake {
                cFlags '-DFLAVORTHREE'
            }
            signingConfig signingConfigs.flavorthreerelease
        }
    }

要将已定义的变量添加到我的c文件中,以便我可以识别其风格。 在我的c文件中我有:

    const char* secret;
    #ifdef FLAVORONE
        const char* secret = "flavor_1_secret";
    #elif FLAVORTWO
        const char* secret = "flavor_2_secret";
    #elif FLAVORTHREE
        const char* secret = "flavor_3_secret";
    #else
        const char* secret = "flavor_1_secret";
    #endif

    JNIEXPORT jstring JNICALL
    Java_com_mycompany_app_MainActivity_getSecret(JNIEnv *env, jobject instance) {
        return (*env)->  NewStringUTF(env, secret);
}

问题是当我在第2或第3版中编译并运行我的代码时,getSecret()返回" flavor_1_secret"。我怀疑我用cflags定义变量时做错了什么,但对于使用NDK来说我是一个新手,我很难弄清楚我做错了什么。我也尝试过:

    const char* secret;
    #ifdef FLAVORTWO
        const char* secret = "flavor_2_secret";
    #else
        const char* secret = "flavor_1_secret";
    #endif

    JNIEXPORT jstring JNICALL
    Java_com_mycompany_app_MainActivity_getSecret(JNIEnv *env, jobject instance) {
        return (*env)->  NewStringUTF(env, secret);
}

并将其编译为flavor2。我仍然得到了秘密回归的味道。所以似乎总是通过else掉落而且没有定义标志变量。

2 个答案:

答案 0 :(得分:1)

我认为您必须将#elseif替换为#elif,预处理器会在#ifdef停止,如果它是 flavor 1 或者跳转到#else如果是其他因为#elseif未定义

答案 1 :(得分:1)

你使用ndkBuild(通过Android.mk),而不是cmake。因此,在风味部分,你需要

externalNativeBuild.ndkBuild