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

Amjad Khan 07/29/2017. 3 answers, 887 views
java android android c++ android-ndk android-ndk jni

Je suis nouveau à ceci ne sais pas comment commencer ceci,

J'ai créé un projet lié à C ++ en utilisant Android.mk

Donc, quand j'appelle une méthode de Java, elle devrait faire la valeur booléenne de stockage à mon objet de préférence partagé.

C'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 je l'ai imprimé fonctionne maintenant seulement juste besoin de créer un objet sharepreference et de définir la valeur booléenne

SharedPreferences prefs = context.getSharedPreferences("myprefdata", Context.MODE_PRIVATE);

prefs.edit().putBoolean("settingnootification", true).commit(); 

S'il vous plaît me guider comment faire. Merci

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

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

3 Answers


vikas kumar 08/05/2017.

J'ai simplement appelé saveBoolean(boolean bool) dans MainActivity de JNI et il 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);
    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 #include 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");
} 

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 le lien pour explorer plus ..

Codage heureux !!!


mko 07/31/2017.

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

Jetez un oeil ici:

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

Dans cet exemple, ce que vous faites est:

  • Java appelle C ++
  • Basé sur des informations transmises depuis Java, C ++ se connecte à JVM
  • Le code C ++ appelle le code Java d'une autre classe (dans votre cas, ce sera l'objet SharedPreferences)

Il se peut que vous ayez besoin d'un cours auxiliaire pour simplifier les choses. Par exemple PreferencesStorer - où vous obtiendrez la classe de préférences et les valeurs de passe que vous voulez stocker.

Jetez un oeil ici:

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

C'est la méthode que vous voulez appeler mais vous voulez qu'elle soit: store (String value, int mode).

Dans votre code (en Java), vous devez créer cet objet et le passer en argument à votre code C ++. Dans C ++, vous voulez appeler la méthode de cet objet. À l'intérieur de la JVM, il sera déjà là - prêt à être appelé.

Si ce n'est pas ce que vous cherchez, je pense que vous devez fournir plus d'informations pour rendre le cas d'utilisation un peu plus clair.

Amusez-vous avec JNI


Amjad Khan 09/06/2017.

J'ai besoin d'appeler une méthode getSharedPreferences (), Alors, comment puis-je appeler cela et stocker booléen.

Donc, j'ai créé deux méthodes simples pour stocker et récupérer la 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 également appelée mon fichier .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);
} 

Related questions

Hot questions

Language

Popular Tags