Android: Πρέπει να δημιουργήσετε αντικείμενο κοινόχρηστων προτιμήσεων στο c ++ NDK και να αποθηκεύσετε κάποια τιμή Boolean

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

Είμαι νέος σε αυτό δεν ξέρω πώς να ξεκινήσετε αυτό,

Έχω δημιουργήσει ένα έργο που συνδέεται με τη C ++ χρησιμοποιώντας το Android.mk

Έτσι όταν καλώ μια μέθοδο από τη java θα πρέπει να κάνει την αποθήκευση boolean αξία στο κοινό μου αντικείμενο προτιμήσεων.

Αυτή είναι η μέθοδος JNI μου

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

κανονικό λογότυπο που έχω εκτυπώσει λειτουργεί τώρα μόνο απλά πρέπει να δημιουργήσετε το αντικείμενο sharepreference και να ορίσετε την τιμή boolean

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

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

Παρακαλώ με καθοδηγήστε πώς να κάνω. Ευχαριστώ

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

Πρέπει να χρησιμοποιήσετε αυτή τη μέθοδο σε c ++

3 Answers


vikas kumar 08/05/2017.

Απλά saveBoolean(boolean bool) στην MainActivity από την JNI και έσωσε την αξία. Εδώ είναι ο κώδικας: 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");
} 

Εδώ είναι οι τύποι υπογραφών μεθόδου

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

Εδώ είναι σύνδεσμος για να εξερευνήσετε περισσότερα ..

Ευτυχισμένη κωδικοποίηση !!!


mko 07/31/2017.

Υποθέτω ότι θέλετε να καλέσετε τάξη Java από τον κωδικό σας. Προτείνω να καλέσετε την Java πίσω από τον κώδικα C ++.

Ρίξτε μια ματιά εδώ:

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

Σε αυτό το δείγμα, αυτό που κάνετε είναι:

  • Η Java καλεί τη C ++
  • Με βάση τις πληροφορίες που διαβιβάζονται από την Java, η C ++ αποδίδεται στην JVM
  • Ο κώδικας C ++ καλεί κώδικα Java από άλλη κλάση (στην περίπτωσή σας, θα είναι αντικείμενο SharedPreferences)

Ίσως θα χρειαστείτε κάποια βοηθητική κλάση για να κάνετε τα πράγματα απλούστερα. Π.χ. PreferencesStorer - όπου θα έχετε τις σωστές τάξεις προτιμήσεων και θα περάσετε αξίες που θέλετε να αποθηκεύσετε.

Ρίξτε μια ματιά εδώ:

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

Αυτή είναι η μέθοδος που θέλετε να καλέσετε, αλλά θέλετε να είναι: store (String value, int mode).

Στον κώδικα σας (σε Java) θα πρέπει να δημιουργήσετε αυτό το αντικείμενο και να το μεταβιβάσετε ως επιχείρημα στον κώδικα C ++. Στο εσωτερικό της C ++ θέλετε να καλέσετε μέθοδο αυτού του αντικειμένου. Μέσα στο JVM θα είναι ήδη εκεί - έτοιμος να σας καλέσει.

Αν αυτό δεν είναι αυτό που ψάχνετε, νομίζω ότι πρέπει να παράσχετε κάποιες περισσότερες πληροφορίες για να φτιάξετε όλο το φάκελο χρήσης κάπως πιο ξεκάθαρο.

Διασκεδάστε με την JNI


Amjad Khan 09/06/2017.

Πρέπει να καλέσω μια μέθοδο getSharedPreferences (), έτσι πώς μπορώ να το καλέσω και να αποθηκεύσω boolean.

Έτσι, δημιούργησα δύο απλές μεθόδους αποθήκευσης και ανάκτησης της τιμής boolean στο 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);
} 

Δηλώθηκε η εγγενής μέθοδος στο MainActivity και κάλεσε επίσης το αρχείο μου .so

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