Android: Perlu membuat objek Preferensi Bersama di c ++ NDK dan Menyimpan beberapa nilai Boolean

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

Saya baru ini tidak tahu bagaimana memulai ini,

Saya telah membuat proyek yang terhubung ke C ++ menggunakan Android.mk

Jadi, ketika saya memanggil metode dari java, ia harus melakukan penyimpanan nilai boolean ke objek preferensi bersama saya.

Ini adalah metode JNI saya

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 Saya telah mencetak itu bekerja sekarang hanya perlu membuat objek referensi berbagi dan mengatur nilai boolean

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

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

Tolong bimbing saya bagaimana melakukannya. Terima kasih

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

Perlu menggunakan metode ini di c ++

3 Answers


vikas kumar 08/05/2017.

Saya baru saja menelepon saveBoolean(boolean bool) di MainActivity dari JNI dan itu menyelamatkan nilainya. Ini kode: 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");
} 

Berikut ini jenis tanda tangan metode

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

Berikut ini tautan untuk menjelajah lebih lanjut ..

Selamat coding !!!


mko 07/31/2017.

Saya kira Anda ingin memanggil kelas Java dari kode Anda. Saya sarankan untuk memanggil Java kembali dari kode C ++ Anda.

Coba lihat di sini:

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

Dalam contoh ini, yang Anda lakukan adalah:

  • Java memanggil C ++
  • Berdasarkan info yang diteruskan dari Java, C ++ menempel ke JVM
  • C + + kode kode kode Java dari kelas lain (dalam kasus Anda, itu akan menjadi SharedPreferences objek)

Mungkin Anda akan membutuhkan beberapa kelas penolong untuk membuat semuanya lebih sederhana. Misalnya PreferencesStorer - di mana Anda akan mendapatkan kelas preferensi yang tepat dan memberikan nilai yang ingin Anda simpan.

Coba lihat di sini:

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

Ini adalah metode yang ingin Anda panggil tetapi Anda menginginkannya: simpan (nilai String, mode int).

Dalam kode Anda (di Java) Anda perlu membuat objek ini dan mengirimkannya sebagai argumen ke kode C ++ Anda. Di dalam C ++ Anda ingin memanggil metode objek ini. Di dalam JVM sudah ada di sana - siap dipanggil.

Jika ini bukan apa yang Anda cari, saya pikir Anda perlu memberikan beberapa info lebih lanjut untuk membuat seluruh kasus penggunaan sedikit lebih jelas.

Bersenang-senanglah dengan JNI


Amjad Khan 09/06/2017.

Saya perlu memanggil metode getSharedPreferences (), Jadi bagaimana saya bisa memanggil itu dan menyimpan boolean.

Jadi, saya telah membuat dua metode sederhana untuk menyimpan dan mengambil nilai boolean dalam 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);
} 

Mendeklarasikan Metode Asli di MainActivity dan juga memanggil file .so saya

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