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:
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); }