Android: Noodzaak om een ​​Shared Preferences-object te maken in c ++ NDK en een of andere Booleaanse waarde op te slaan

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

Ik ben nieuw in deze weet niet hoe dit te starten,

Ik heb een project gemaakt dat is gekoppeld aan C ++ met Android.mk

Dus als ik een methode vanuit java aanroer, moet deze de boolean-waarde voor opslaan in mijn gedeelde voorkeursobject doen.

Dit is mijn 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);
} 

normaal log ik heb afgedrukt het werkt nu alleen hoef je een sharepreference-object aan te maken en de booleaanse waarde in te stellen

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

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

Leid me alstublieft hoe te doen. Bedankt

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

Moet deze methode gebruiken in C ++

3 Answers


vikas kumar 08/05/2017.

Ik noemde zojuist saveBoolean(boolean bool) in MainActivity van JNI en het heeft de waarde opgeslagen. Hier is de 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");
} 

Dit zijn methoden voor handtekeningen van methoden

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

Hier is een link om meer te ontdekken ..

Gelukkig coderen !!!


mko 07/31/2017.

Ik neem aan dat je Java-klasse vanuit je code wilt bellen. Ik stel voor om Java terug te roepen van je C ++ -code.

Neem hier een kijkje:

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

In dit voorbeeld is wat u doet:

  • Java roept C ++ op
  • Op basis van informatie die door Java is doorgegeven, wordt C ++ gekoppeld aan JVM
  • C ++-code roept Java-code op uit een andere klasse (in uw geval wordt dit het object SharedPreferences)

Misschien heb je een helper nodig om dingen eenvoudiger te maken. Bijvoorbeeld PreferencesStorer - waar u de juiste voorkeurenklasse krijgt en waarden doorgeeft die u wilt opslaan.

Neem hier een kijkje:

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

Dit is de methode die u wilt aanroepen, maar die u wilt hebben: store (Stringwaarde, int-modus).

In je code (in Java) moet je dit object maken en doorgeven als argument aan je C ++ -code. Binnen C ++ wil je de methode van dit object aanroepen. Binnen JVM is het er al - klaar om gebeld te worden.

Als dit niet is wat je zoekt, denk ik dat je wat meer info moet geven om het hele gebruik-geval iets duidelijker te maken.

Veel plezier met JNI


Amjad Khan 09/06/2017.

Ik moet een methode getSharedPreferences () aanroepen, dus hoe kan ik dat aanroepen en boolean opslaan.

Ik heb dus twee eenvoudige methoden voor het opslaan en ophalen van de Booleaanse waarde in NDK C ++ gemaakt

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

Inheemse methode in MainActivity opgegeven en ook mijn .so-bestand genoemd

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