Android: Behov for at oprette Delt præferenceobjekt i c ++ NDK og gemme en boolsk værdi

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

Jeg er ny på dette ved ikke, hvordan man starter dette,

Jeg har oprettet et projekt, der er knyttet til C ++ ved hjælp af Android.mk

Så når jeg kalder en metode fra java, skal den gøre den lagrede booleanske værdi til mit delte præferenceobjekt.

Dette er min JNI-metode

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

normal log Jeg har udskrevet det, der arbejder nu, behøver kun at oprette sharepreference-objekt og indstille boolsk værdi

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

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

Vær venlig at guide mig, hvordan du gør det. Tak

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

Brug for denne metode i c ++

3 Answers


vikas kumar 08/05/2017.

Jeg har lige kaldt saveBoolean(boolean bool) i MainActivity fra JNI og det gemte værdien. Her er 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");
} 

Her er metoden signaturtyper

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

Her er link til at udforske mere ..

Glad kodning !!!


mko 07/31/2017.

Jeg gætter du vil kalde Java klasse fra din kode. Jeg foreslår at kalde Java tilbage fra din C ++ kode.

Se her:

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

I denne prøve er hvad du gør:

  • Java kalder C ++
  • Baseret på info sendt fra Java, er C ++ knyttet til JVM
  • C ++-kode kalder Java-kode fra en anden klasse (i dit tilfælde vil det være SharedPreferences-objekt)

Det kan være, du skal bruge nogle hjælperklasser for at gøre tingene enklere. F.eks. PreferencesStorer - hvor du vil få de rette præferencer klasse og videregive værdier, du vil gemme.

Se her:

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

Dette er den metode, du vil ringe til, men du vil have det: butik (strengværdi, int-tilstand).

I din kode (i Java) skal du oprette dette objekt og sende det som argument til din C ++ kode. Inde C ++ vil du kalde metode til dette objekt. Inde i JVM er det allerede der - klar til at blive kaldt.

Hvis dette ikke er det, du leder efter, synes jeg, du skal give nogle flere oplysninger for at gøre hele brugen tilfældet lidt mere tydelig.

Hav det sjovt med JNI


Amjad Khan 09/06/2017.

Jeg skal ringe en getSharedPreferences () metode, så hvordan kan jeg ringe til det og gemme booleske.

Så jeg har lavet to enkle metoder til lagring og hente boolsk værdi i 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);
} 

Erklæret indfødt metode i MainActivity og kaldes også min .so-fil

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