Java — поддержка NDK с различным вкусом продукта

я хочу разные строка значение из ndk библиотеки.
так как у меня есть два демо аромата и живой, я хочу значение «привет, я из демо» для демо аромата и для живого аромата, я хочу «привет, я из живого»

Вот мой код файла Java

public class MainActivity extends AppCompatActivity {
// Used to load the 'native-lib' library on application startup.
static {
System.loadLibrary("native-lib");
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// Example of a call to a native method
TextView tv = (TextView) findViewById(R.id.sample_text);
tv.setText(stringFromJNI());
}

/**
* A native method that is implemented by the 'native-lib' native library,
* which is packaged with this application.
*/
public native String stringFromJNI();

}

Вот мой код cpp файла

#include <jni.h>
#include <string>

extern "C"JNIEXPORT jstring JNICALL
Java_com_de_demo_ndk2_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /* this */) {
std::string hello = "hello I am from  demo";
return env->NewStringUTF(hello.c_str());
}

это мой файл build.gradle

apply plugin: 'com.android.application'

android {
compileSdkVersion 26
defaultConfig {
applicationId "com.de.demo.ndk2"minSdkVersion 15
targetSdkVersion 26
versionCode 1
flavorDimensions "default"versionName "1.0"testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"externalNativeBuild {
cmake {
cppFlags ""}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
productFlavors {

demo
{
// applicationId "com.readwhere.whitelabel.test"//applicationId "com.android.rwstaging"applicationId "com.android.demo"versionName "2.1"dimension "default"
externalNativeBuild {
cmake {

targets "native-lib-demo","my-executible-                   demo"
}}}
live
{
// applicationId "com.readwhere.whitelabel.test"//applicationId "com.android.rwstaging"applicationId "com.android.live"versionName "2.1"dimension "default"}}
externalNativeBuild {
cmake {
path "CMakeLists.txt"}
}
}

Я вставил один и тот же файл cpp в демонстрационную папку, а также в основную папку
но мог бы выполнить мою задачу. Любая помощь будет признательна
это некоторые ссылки

https://developer.android.com/studio/projects/gradle-external-native-builds.html

Как установить путь CmakeLists во вкусе продукта для каждого Android ABI?

2

Решение

Вероятно, минимальный код для достижения вашей цели во время компиляции — это установить CPPFLAGS по вкусу:

productFlavors {
demo {
applicationId "com.android.demo"versionName "2.1"dimension "default"
externalNativeBuild.cmake {
cppFlags '-DDEMO'
}
}
live {
applicationId "com.android.live"versionName "2.1"dimension "default"externalNativeBuild.cmake {
cppFlags '-DLIVE'
}
}
}

и в вашем CPP файл

#ifdef DEMO
std::string hello = "hello I am from demo";
#endif
#ifdef LIVE
std::string hello = "hello I am from live";
#endif

Или вы можете использовать stingify шаблон, как в этом ответ.

Естественно, ваша условная компиляция не ограничивается вариацией строки.

3

Другие решения

Наконец-то я нашел решение.
Вот мой код cpp файла

Java_com_de_demo_ndk2_MainActivity_stringFromJNI(
JNIEnv *env,
jobject jobject1, jstring jstring1) {

std::string hello;
const char *nativeString1 = env->GetStringUTFChars( jstring1, 0);
if (strcmp(nativeString1, "demo") == 0) {
hello = "Hello from demo C++";
} else if (strcmp(nativeString1, "live") == 0) {
hello = "Hello from live C++";
}

return env->NewStringUTF(hello.c_str());
}

Я передаю значение аромата из кода Java, вот мой код для файла Java.

public class MainActivity extends AppCompatActivity {

// Used to load the 'native-lib' library on application startup.
static {
System.loadLibrary("native-lib");
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// Example of a call to a native method
TextView tv = (TextView) findViewById(R.id.sample_text);
String value = BuildConfig.FLAVOR;
String ndkValue = stringFromJNI(value);
tv.setText(ndkValue);
}

/**
* A native method that is implemented by the 'native-lib' native library,
* which is packaged with this application.
* @param value
*/
public native String stringFromJNI(String value);
}

Теперь я могу получить любой текст в соответствии с выбранным вкусом.

1