I want different string value from ndk library. as i have two flavor demo and live I want value "hello I am from demo " for demo flavor and for live flavor i want "hello I am from live "
Here is my java file code
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();
}
Here is my cpp file code
#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());
}
this is my build.gradle file
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"
}
}
}
I have paste same cpp file in demo folder as well as in main folder but could achieve my task. Any help would be appreciate this are some refrence links
https://developer.android.com/studio/projects/gradle-external-native-builds.html
How to set CmakeLists path in product flavor for each Android ABI?
You use same core ingredients to make the base but will use different toppings for each one to have a different taste. Similarly, android apps can have the same base functionalities with changes to some of the features like styles, logo etc. This can be achieved using product flavours.
Build Type applies different build and packaging settings. An example of build types are “Debug” and “Release”. Product Flavors specify different features and device requirements, such as custom source code, resources, and minimum API levels.
gradle. getStartParameter(). getTaskRequests(). toString() contains your current flavor name but the first character is capital.
A flavorDimension is something like a flavor category and every combination of a flavor from each dimension will produce a variant. In your case, you must define one flavorDimension named "type" and another dimension named "organization".
Probably, the minimal code to achieve your goal at compile time is to set cppFLags per flavor:
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'
}
}
}
and in your cpp file
#ifdef DEMO
std::string hello = "hello I am from demo";
#endif
#ifdef LIVE
std::string hello = "hello I am from live";
#endif
Or you can use stingify pattern as in this answer.
Naturally, your conditional compilation is not limited to string variation.
Finally I a solution. Here is my cpp file code
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());
}
I am passing flavor value from java code here is my code for java file.
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);
}
Now i can get whatever text i want according to selected flavor.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With