Android: Sie müssen ein Shared Preferences-Objekt in C ++ NDK erstellen und einen booleschen Wert speichern

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

Ich bin neu dazu, weiß nicht wie ich das anfangen soll,

Ich habe ein Projekt erstellt, das mit C ++ unter Verwendung von Android.mk verbunden ist

Wenn ich also eine Methode von Java aus anrufe, sollte sie den booleschen Wert für mein gemeinsames Präferenzobjekt speichern.

Das ist meine JNI-Methode

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

normales Protokoll Ich habe gedruckt, es funktioniert jetzt nur brauchen nur Sharepreference-Objekt erstellen und boolean Wert setzen

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

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

Bitte führe mich, wie es geht. Vielen Dank

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

Müssen diese Methode in C ++ verwenden

3 Answers


vikas kumar 08/05/2017.

Ich habe gerade saveBoolean(boolean bool) in MainActivity von JNI aufgerufen und den Wert gespeichert. Hier ist 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");
} 

Hier sind Methoden Signatentypen

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

Hier ist Link, um mehr zu erfahren ..

Fröhliche Codierung !!!


mko 07/31/2017.

Ich denke, Sie möchten Java-Klasse von Ihrem Code aufrufen. Ich schlage vor, Java von Ihrem C ++ Code zurückzurufen.

Schau mal hier:

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

In diesem Beispiel tun Sie Folgendes:

  • Java ruft C ++ auf
  • Basierend auf Informationen, die von Java übergeben wurden, hängt C ++ an JVM an
  • C ++ - Code ruft Java-Code von einer anderen Klasse auf (in Ihrem Fall ist es das SharedPreferences-Objekt)

Es könnte sein, dass Sie eine Hilfsklasse benötigen, um die Dinge zu vereinfachen. ZB PreferencesStorer - wo Sie die richtige Voreinstellungsklasse erhalten und Werte übergeben, die Sie speichern möchten.

Schau mal hier:

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

Dies ist die Methode, die Sie aufrufen möchten, aber Sie möchten es: store (String value, int mode).

In Ihrem Code (in Java) müssen Sie dieses Objekt erstellen und es als Argument an Ihren C ++ - Code übergeben. In C ++ möchten Sie die Methode dieses Objekts aufrufen. In JVM wird es schon da sein - bereit, angerufen zu werden.

Wenn das nicht das ist, wonach Sie suchen, müssen Sie, glaube ich, einige weitere Informationen bereitstellen, um den gesamten Anwendungsfall ein wenig klarer zu machen.

Viel Spaß mit JNI


Amjad Khan 09/06/2017.

Ich muss eine getSharedPreferences () -Methode aufrufen, also wie kann ich das aufrufen und boolean speichern.

Also habe ich zwei einfache Methoden zum Speichern und Abrufen boolescher Werte in NDK C ++ erstellt

Hauptaktivität.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);
} 

Native Methode in MainActivity deklariert und auch meine .so-Datei genannt

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