Android: Nécessité de créer un object Préférences partagées dans c ++ NDK et de stocker une valeur booléenne

Je suis nouveau à cela, je ne sais pas comment commencer,

J’ai créé un projet lié au C ++ à l’aide d’Android.mk

Ainsi, lorsque j’appelle une méthode de java, elle doit enregistrer la valeur booléenne dans mon object de préférence partagé.

Ceci est ma méthode JNI

extern "C" JNIEXPORT void JNICALL Java_com_example_sample_storeBoolean(JNIEnv *env,jobject instance){ //TODO const char *name ="hello"; __android_log_print(ANDROID_LOG_ERROR, "TRACKERS", "***** %s *****", name); } 

journal normal que j’ai imprimé, il fonctionne maintenant, il suffit de créer un object sharepreference et de définir une valeur booléenne

 SharedPreferences prefs = context.getSharedPreferences("myprefdata", Context.MODE_PRIVATE); prefs.edit().putBoolean("settingnootification", true).commit(); 

S’il vous plaît guidez-moi comment faire. Merci

 public abstract SharedPreferences getSharedPreferences(Ssortingng name, int mode); 

Besoin d’utiliser cette méthode en c ++

Je viens d’appeler saveBoolean(boolean bool) dans MainActivity à partir de JNI et cela a enregistré la valeur. Voici le code: MainActivity

 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); ssortingngFromJNI(this); } /** * A native method that is implemented by the 'native-lib' native library, * which is packaged with this application. */ public native void ssortingngFromJNI(MainActivity mainActivity); public void saveBoolean(boolean bool){ SharedPreferences sharedPreferences = this.getSharedPreferences("Test", Context.MODE_PRIVATE); sharedPreferences.edit().putBoolean("testBool",bool).commit(); Log.d("MainActivity","saveBoolean Called "+bool); } 

}

 #include  #include  extern "C" JNIEXPORT void JNICALL Java_com_android_techgig_sharedpref_MainActivity_ssortingngFromJNI(JNIEnv *env,jobject obj /* this */) { jclass cls = (env)->GetObjectClass(obj); //for getting class jmethodID mid = (env)->GetMethodID(cls, "saveBoolean", "(Z)V"); //for getting method signature, Z for boolean if (mid == 0) return; //will return 0 in case of class not found (env)->CallVoidMethod(obj, mid, true); //now calling actual method printf("native called"); } 

Voici les types de signatures de méthodes

 Signature Java Type Z boolean B byte C char S short I int J long F float D double 

Voici un lien pour explorer plus ..

Bonne codage !!!

Je suppose que vous voulez appeler la classe Java à partir de votre code. Je suggère de rappeler Java à partir de votre code C ++.

Jetez un coup d’oeil ici:

https://github.com/mkowsiak/jnicookbook/tree/master/recipeNo032

Dans cet exemple, vous procédez comme suit:

  • Java appelle C ++
  • Sur la base des informations transmises par Java, C ++ s’attache à la machine virtuelle Java
  • Le code C ++ appelle le code Java d’une autre classe (dans votre cas, ce sera l’object SharedPreferences)

Vous aurez peut-être besoin d’une classe d’assistance pour simplifier les choses. Par exemple, PreferencesStorer – où vous obtiendrez la classe de préférences appropriée et passerez les valeurs que vous souhaitez stocker.

Jetez un coup d’oeil ici:

 public static int fun() { System.out.println("From JVM"); return 0; } 

C’est la méthode que vous voulez appeler mais que vous voulez: store (valeur de chaîne, mode int).

Dans votre code (en Java), vous devez créer cet object et le transmettre en tant qu’argument à votre code C ++. Dans C ++, vous voulez appeler la méthode de cet object. Dans la JVM, il sera déjà là – prêt à être appelé.

Si ce n’est pas ce que vous recherchez, je pense que vous devez fournir quelques informations supplémentaires afin de clarifier l’ensemble du cas d’utilisation.

Amusez-vous avec JNI

Je dois appeler une méthode getSharedPreferences (). Alors, comment puis-je appeler cela et stocker boolean.

J’ai donc créé deux méthodes simples pour stocker et récupérer une valeur booléenne dans NDK C ++.

MainActivity.java

 public class MainActivity extends Activity { // Used to load the 'native-lib' library on application startup. static { System.loadLibrary("Native"); } private Activity activity; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); activity=MainActivity.this; setStoreBoolValues(activity, true); if (getStoreValues(activity)) Log.e("Store Value", " ** true **"); else Log.e("Store Value", " ** false **"); } public native boolean getStoreValues(Activity activity); public native void setStoreBoolValues(Activity activity, boolean flag); } 

Méthode native déclarée dans MainActivity et aussi appelée mon fichier .so

NativeClass.Cpp

 jobject mainClass; jssortingng spname(JNIEnv *env) { return env->NewSsortingngUTF("sharedstore"); } jssortingng objectname(JNIEnv *env) { return env->NewSsortingngUTF("boolvaluestore"); } extern "C" JNIEXPORT jboolean JNICALL Java_com_ebizzinfotech_amjad_contentresolverproj_MainActivity_getStoreValues(JNIEnv *env, jobject instance, jobject activity) { jclass spcls = env->FindClass("android/content/SharedPreferences"); jclass contextcls = env->FindClass("android/content/Context"); mainClass = env->NewGlobalRef(activity); jmethodID mid = env->GetMethodID(contextcls, "getSharedPreferences", "(Ljava/lang/Ssortingng;I)Landroid/content/SharedPreferences;"); jmethodID midbool = env->GetMethodID(spcls, "getBoolean", "(Ljava/lang/Ssortingng;Z)Z"); jobject jobjectshared = env->CallObjectMethod(mainClass, mid, spname(env), 0); // jobject jobjectsharededit = env->CallObjectMethod(jobjectshared,midedit); jboolean jboolean1 = env->CallBooleanMethod(jobjectshared, midbool,objectname(env), JNI_FALSE); env->DeleteLocalRef(spcls); env->DeleteLocalRef(contextcls); return jboolean1; } extern "C" JNIEXPORT void JNICALL Java_com_ebizzinfotech_amjad_contentresolverproj_MainActivity_setStoreBoolValues(JNIEnv *env, jobject instance, jobject activity, jboolean flag) { jclass spcls = env->FindClass("android/content/SharedPreferences"); jclass speditorcls = env->FindClass("android/content/SharedPreferences$Editor"); jclass contextcls = env->FindClass("android/content/Context"); mainClass = env->NewGlobalRef(activity); jmethodID mid = env->GetMethodID(contextcls, "getSharedPreferences", "(Ljava/lang/Ssortingng;I)Landroid/content/SharedPreferences;"); jmethodID midedit = env->GetMethodID(spcls, "edit", "()Landroid/content/SharedPreferences$Editor;"); jmethodID midputbool = env->GetMethodID(speditorcls, "putBoolean", "(Ljava/lang/Ssortingng;Z)Landroid/content/SharedPreferences$Editor;"); jmethodID midapply = env->GetMethodID(speditorcls, "apply", "()V"); jobject jobjectshared = env->CallObjectMethod(mainClass, mid,spname(env), 0); jobject jobjectsharededit = env->CallObjectMethod(jobjectshared, midedit); env->CallVoidMethod(env->CallObjectMethod(jobjectsharededit, midputbool, objectname(env), flag), midapply); env->DeleteLocalRef(spcls); env->DeleteLocalRef(contextcls); env->DeleteLocalRef(speditorcls); }