在我的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掉落而且没有定义标志变量。
答案 0 :(得分:1)
我认为您必须将#elseif
替换为#elif
,预处理器会在#ifdef
停止,如果它是 flavor 1 或者跳转到#else
如果是其他因为#elseif
未定义
答案 1 :(得分:1)
你使用ndkBuild(通过Android.mk),而不是cmake。因此,在风味部分,你需要
externalNativeBuild.ndkBuild