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
- Escriba a stdout en JNI Android? Sin <android / log.h>
- Qt para Android - el equivalente de startActivityForResult no funciona
- JNI ERROR DETECTADO EN APLICACIÓN: entrada no es válida UTF-8 modificado: byte de inicio ilegal 0xfc.
- C El código JNI introduce errores en un proyecto Android Eclipse una vez que se abre el archivo C en el editor
- Android JNI ¿Cuál es el directorio de trabajo actual para C / C ++ ejecutado código?
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 ++
- Androide applicatin no puede encontrar la biblioteca jni cuando se instala como aplicación del sistema
- JNI: no se puede encontrar la biblioteca en java.library.path al ejecutar JUnit
- No se puede obtener el valor JNIEnv * en contexto arbitrario
- ¿Cuál es la mejor manera de guardar JNIEnv *
- ¿Cómo crear un objeto con JNI?
- ¿Qué dispositivos Android admiten jni?
- Imprimir el seguimiento de la pila C en Android 5 / Lolipop
- ByteBuffer no libera memoria
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); }
- El dispositivo Sreenshot no funciona en Android Debug Monitor
- ¿Prueba el navegador Android sin el emulador?