Android: Perlu membuat objek Pilihan Dikongsi dalam c ++ NDK dan Simpan beberapa nilai Boolean

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

Saya baru untuk ini tidak tahu bagaimana untuk memulakan ini,

Saya telah membuat projek yang dikaitkan dengan C ++ menggunakan Android.mk

Oleh itu, apabila saya memanggil kaedah dari java, ia harus melakukan nilai boolean penyimpanan ke objek preferensi bersama saya.

Ini adalah kaedah 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 biasa saya telah mencetak ia berfungsi sekarang hanya perlu membuat objek sharepreference dan menetapkan nilai boolean

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

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

Tolong bimbing saya bagaimana untuk melakukannya. Terima kasih

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

Perlu menggunakan kaedah ini dalam c ++

3 Answers


vikas kumar 08/05/2017.

Saya hanya memanggil saveBoolean(boolean bool) di MainActivity dari JNI dan ia menyelamatkan nilai. Berikut adalah kod: 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 adalah jenis tanda tangan kaedah

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

Berikut adalah pautan untuk meneroka lebih banyak ..

Selamat coding !!!


mko 07/31/2017.

Saya rasa anda mahu memanggil kelas Java dari kod anda. Saya cadangkan untuk memanggil Java kembali dari kod C ++ anda.

Lihat di sini:

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

Dalam contoh ini, apa yang anda lakukan ialah:

  • Panggilan Java C ++
  • Berdasarkan info yang diluluskan dari Java, C ++ melekat pada JVM
  • Kod C ++ memanggil kod Java dari kelas lain (dalam kes anda, ia akan menjadi objek SharedPreferences)

Mungkin anda memerlukan beberapa kelas pembantu untuk membuat perkara lebih mudah. Contohnya PreferencesStorer - di mana anda akan mendapat kelas pilihan dan nilai lulus yang anda mahu simpan.

Lihat di sini:

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

Ini adalah kaedah yang anda mahu hubungi tetapi anda mahu menjadi: menyimpan (Nilai rentetan, mod int).

Dalam kod anda (dalam bahasa Java), anda perlu mencipta objek ini dan lulus sebagai hujah kepada kod C ++ anda. Di dalam C ++ anda mahu memanggil kaedah objek ini. Di dalam JVM itu sudah ada - bersedia dipanggil.

Jika ini bukan apa yang anda cari, saya fikir anda perlu memberikan lebih banyak maklumat untuk menjadikan kes penggunaan keseluruhan lebih jelas.

Bersenang-senang dengan JNI


Amjad Khan 09/06/2017.

Saya perlu memanggil kaedah getSharedPreferences (), jadi bagaimana saya boleh memanggilnya dan menyimpan boolean.

Jadi, saya telah membuat dua kaedah mudah untuk menyimpan dan mengambil semula 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);
} 

Disahkan Kaedah Native di MainActivity dan juga dipanggil fail .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