Android: Necesidad de crear un objeto Preferencias compartidas en c ++ NDK y almacenar algún valor booleano

Soy nuevo en esto no sé cómo empezar esto,

He creado un proyecto que está vinculado a C ++ con Android.mk

Así que cuando llamo a un método de java debe hacer el valor booleano de almacenamiento a mi objeto de preferencia compartida.

Este es mi método 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); } 

Log normal que he impreso que está trabajando ahora sólo necesita crear sharepreference objeto y establecer el valor booleano

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

Por favor, guíame cómo hacer. Gracias

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

Necesidad de utilizar este método en c ++

Acabo de llamar saveBoolean(boolean bool) en MainActivity de JNI y guardó el valor. Aquí está el código: 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); stringFromJNI(this); } /** * A native method that is implemented by the 'native-lib' native library, * which is packaged with this application. */ public native void stringFromJNI(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 <jni.h> #include <string> extern "C" JNIEXPORT void JNICALL Java_com_android_techgig_sharedpref_MainActivity_stringFromJNI(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"); } 

Aquí está el método tipos de firmas

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

Aquí está un enlace para explorar más ..

Codificación feliz!

Supongo que quieres llamar a la clase Java de tu código. Le sugiero que devuelva Java a su código C ++.

Echa un vistazo aquí:

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

En esta muestra, lo que haces es:

  • Java llama a C ++
  • Basado en información transmitida desde Java, C ++ se conecta a JVM
  • El código C ++ llama a código Java de otra clase (en su caso, será objeto SharedPreferences)

Podría ser que necesitará alguna clase de ayuda para hacer las cosas más simples. Por ejemplo, PreferencesStorer – donde obtendrá las preferencias apropiadas y los valores de paso que desea almacenar.

Echa un vistazo aquí:

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

Este es el método que desea llamar, pero desea que sea: store (String value, int mode).

En tu código (en Java) necesitas crear este objeto y pasarlo como argumento a tu código C ++. Dentro de C ++ desea llamar al método de este objeto. Dentro de JVM ya estará allí – listo para ser llamado.

Si esto no es lo que estás buscando, creo que necesitas proporcionar más información para hacer todo el caso de uso un poco más claro.

Diviértete con JNI

Tengo que llamar a un método getSharedPreferences (), Así que ¿cómo puedo llamar a eso y almacenar boolean.

Por lo tanto, he creado dos métodos simples para almacenar y recuperar valor booleano en NDK C ++

MainActivity.java

 public class MainActivity extends Activity { // Used to load the 'native-lib' library on application startup. static { System.loadLibrary("Native"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 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); } 

Declarado método nativo en MainActivity y también llamado mi archivo .so

NativeClass.Cpp

 jobject mainClass; jstring spname(JNIEnv *env) { return env->NewStringUTF("sharedstore"); } jstring objectname(JNIEnv *env) { return env->NewStringUTF("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/String;I)Landroid/content/SharedPreferences;"); jmethodID midbool = env->GetMethodID(spcls, "getBoolean", "(Ljava/lang/String;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/String;I)Landroid/content/SharedPreferences;"); jmethodID midedit = env->GetMethodID(spcls, "edit", "()Landroid/content/SharedPreferences$Editor;"); jmethodID midputbool = env->GetMethodID(speditorcls, "putBoolean", "(Ljava/lang/String;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); } 
  • Uso de funciones nativas en Android con OpenCV
  • ¿Cómo hacer una llamada correcta desde Android a una función no estática en Java? (Cocos2Dx en la mezcla)
  • NewGlobalRef para jmethodID
  • JNI ERROR (bug de la aplicación): desbordamiento de la tabla de referencia local (máx = 512)
  • Java: acceso al campo final estático en JNI
  • No se puede asignar suficiente memoria en JNI
  • Javah Error android.app.Activity not found
  • ¿Cómo puedo capturar SIGSEGV (error de segmentación) y obtener un seguimiento de pila bajo JNI en Android?
  • Enviar cadena C ++ a Java a través de JNI
  • Error :() referencia indefinida a `__android_log_write 'ERROR?
  • Bloquear el cuadro de diálogo desde el código JNI
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.