Πρόσβαση στο περιβάλλον του Android στην εφαρμογή ndk

cppdev 12/15/2010. 2 answers, 7.899 views
android android android-ndk android-ndk

Υπάρχει κάποιος τρόπος με τον οποίο μπορώ να περάσω / να αποκτήσω ένα αντικείμενο του Android στο πλαίσιο της εφαρμογής μου ndk. Θέλω να χρησιμοποιήσω το SharedPreferences στην εφαρμογή ndk μέσω του interface jni. Για να πάρετε μια παρουσία του αντικειμένου SharedPreferences , πρέπει να καλέσω getSharedPreferences() στο αντικείμενο Context . Αλλά δεν έχω πρόσβαση στο αντικείμενο περιβάλλοντος.

Ή

Πώς μπορώ να διαβάσω και να γράψω ένα αρχείο xml από το NDK;

Οποιοσδήποτε δείκτης θα εκτιμηθεί.

3 Comments
ognian 12/15/2010
Πώς να διαβάσετε και να γράψετε αρχείο xml: xmlsoft.org
Sebastian Roth 12/15/2010
Ενώ δεν έχετε εμπειρία με το NDK, δεν νομίζω ότι μπορείτε να έχετε πρόσβαση στο περιβάλλον. Η ανάπτυξη του NDK είναι μόνο για κρίσιμα για το χρόνο, την υψηλή απόδοση και τα πράγματα χαμηλού επιπέδου. Προτείνω να βρείτε τα πιο κρίσιμα δεδομένα διαμόρφωσης που χρειάζεστε και να τα γράψετε είτε σε JSON είτε σε XML και να τα αναλύσετε από τον κώδικα NDK.
Mr.Cool 05/22/2013
@ cppdev τώρα επίσης αντιμετωπίζω το ίδιο πρόβλημα, αν έχετε εφαρμόσει αυτό, μπορείτε να μοιραστείτε

2 Answers


Lucas S. 12/22/2010.

Δεν υπάρχει τίποτα ιδιαίτερο που πρέπει να κάνετε, είναι ακριβώς όπως ο τακτικός μηχανισμός JNI. Πρέπει να πάρετε έναν δείκτη στο αντικείμενο περιβάλλοντος, στη συνέχεια να ανακτήσετε το αναγνωριστικό μεθόδου που θέλετε να καλέσετε και στη συνέχεια να το καλέσετε με τα args που θέλετε.

Φυσικά με λόγια ακούγεται πολύ απλό, αλλά σε κώδικα γίνεται πολύ ακατάστατος από τότε που όλοι οι έλεγχοι και οι κλήσεις JNI.

Έτσι, κατά τη γνώμη μου δεν θα προσπαθήσω να υλοποιήσω το όλο θέμα από τον εγγενή κώδικα JNI, αλλά θα εφαρμόσω μια μέθοδο βοηθού Java που θα κάνει όλα τα πράγματα και θα λάβει ακριβώς τα απαραίτητα δεδομένα για να διαβάσει / γράψει την προτίμηση.

Αυτό θα απλοποιήσει πολύ τον εγγενή κωδικό σας και θα σας διευκολύνει στη συντήρηση.

π.χ:

//Somewhere inside a function in your native code
void Java_com_example_native_MainActivity_nativeFunction(JNIEnv* env, jobject thiz)
{
    jclass cls = (*env)->FindClass(env,"PreferenceHelper");
    if (cls == 0) printf("Sorry, I can't find the class");

    jmethodID set_preference_method_id;

    if(cls != NULL)
    {
        set_preference_method_id = (*env)->GetStaticMethodID(env, cls, "setPreference", "(Ljava/lang/String;Ljava/lang/StringV");

        if(set_preference_method_id != NULL )
        {
            jstring preference_name = (*env)->NewStringUTF(env, "some_preference_name");
            jstring value = (*env)->NewStringUTF(env, "value_for_preference");

            (*env)->CallStaticVoidMethod(env, cls, get_main_id, preference_name, value);
        }
    }
} 

Σημειώστε ότι μόλις έγραψα τον κώδικα από τη μνήμη, έτσι περιμένω να μην δουλέψω από το κουτί.

2 comments
Igor Ganapolsky 04/12/2016
Τι είναι η μεταβλητή env ; Είναι ένα Πλαίσιο που πρέπει να περάσει στο Android;
1 aasu 09/08/2016
@IgorGanapolsky Δεν χρειάζεται να μεταβιβαστεί ρητά ως όρισμα στην κλήση λειτουργίας JNI επειδή το JVM εσωτερικά το περάσει. Δείτε το en.wikipedia.org/wiki/Java_Native_Interface#How_the_JNI_work s

dev 02/16/2016.

Φαίνεται ότι τα πράγματα έχουν αλλάξει πρόσφατα και η παραπάνω λύση και λίγοι άλλοι που δημοσιεύθηκαν σε άλλες δημοσιεύσεις SO δεν λειτουργούσαν για μένα. Μετά από λίγες προσπάθειες μπορώ να κάνω τις επόμενες λύσεις. Ο στόχος μου ήταν να περάσω το αντικείμενο περιβάλλοντος στο JNI και να αποκτήσω απόλυτη διαδρομή αποθήκευσης.

void Java_com_path_to_my_class_jniInit(JNIEnv* env, jobject thiz, jobject contextObject) {

    try {
         //Get Context Class descriptor
         jclass contextClass = env->FindClass("android/content/Context");
         //Get methodId from Context class
         jmethodID getFilesDirMethodId = env->GetMethodID(contextClass,"getFilesDir","()Ljava/io/File;");

         //Call method on Context object which is passed in
         jobject fileObject = env->CallObjectMethod(contextObject,getFilesDirMethodId);

         //Get File class descriptor
         jclass fileClass = env->FindClass("java/io/File");
         //Get handle to the method that is to be called
         jmethodID absolutePathMethodId = env->GetMethodID(fileClass,"getAbsolutePath","()Ljava/lang/String;");
         //Call the method using fileObject
         jstring stringObject = (jstring)env->CallObjectMethod(fileObject,absolutePathMethodId);
      }
      catch(exception& ex){
            JNIExceptionHelper::throwException(env, ex.what());
            return;
      }
} 
1 comments
Igor Ganapolsky 04/12/2016
Νόμιζα ότι τα επιχειρήματα πάνε στην τελευταία θέση στη λίστα παραμέτρων για το GetMethodID σύμφωνα με το περιοδικό GetMethodID g / .... Ωστόσο, περνάτε το contextClass ως την πρώτη παράμετρο;

Related questions

Hot questions

Language

Popular Tags