【问题标题】:android NDK cflags not defined for product flavorsandroid NDK cflags 未为产品风味定义
【发布时间】:2018-05-08 18:34:32
【问题描述】:

在我的 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。我仍然得到了风味 1 的秘密回报。所以它似乎总是通过 else 并且没有定义标志变量。

【问题讨论】:

    标签: android android-ndk


    【解决方案1】:

    我认为你必须用#elif替换#elseif,如果是flavor 1,预处理器会停在#ifdef,如果是其他,则跳转到#else,因为#elseif是未定义

    【讨论】:

    • 啊,我刚刚使用 ifDef 和 else 的第二种情况呢?
    • 谢谢,我修复了 elif 问题并编辑了原始问题。
    • 顺便说一句,你方法中秘密字符串的值是多少?总是 Null,你是不是忘记了什么?
    • 它是在 ifdef 语句中声明的。
    • 哦抱歉没看到gradle脚本
    【解决方案2】:

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

    externalNativeBuild.ndkBuild
    

    【讨论】:

    • 我把代码改成了:productFlavors { flavorone{ externalNativeBuild. ndkBuild { cFlags '-DFLAVORONE' } signingConfig signingConfigs.flavoronerelease } flavortwo{ applicationId "com.mycompany. ndkBuild" versionCode 2 versionName "1.0.1" externalNativeBuild.cmake { cFlags '-DFLAVORTWO' } signingConfig signingConfigs.flavortworelease } 并且flag变量还没有定义。
    • 我看到一些cmake 仍然存在。 cmets 的格式很难理解。请尝试使用this technique 查看实际传递给ndk-build 的标志。
    • 糟糕,在通用代码中遗漏了一些 cmake,但在我的实际代码中是正确的。现在看那个链接。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    相关资源
    最近更新 更多