Akses konteks android dalam aplikasi ndk

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

Adakah terdapat cara di mana saya boleh lulus / mendapatkan objek konteks android dalam aplikasi saya. Saya mahu menggunakan SharedPreferences dalam aplikasi ndk saya melalui antara muka jni. Untuk mendapatkan contoh objek SharedPreferences , saya perlu memanggil getSharedPreferences() pada objek Context . Tetapi saya tidak mempunyai akses kepada objek konteks.

ATAU

Bagaimanakah saya dapat membaca dan menulis fail xml daripada NDK?

Mana-mana petunjuk akan dihargai.

3 Comments
ognian 12/15/2010
Cara membaca dan menulis fail xml: xmlsoft.org
Sebastian Roth 12/15/2010
Walaupun tidak mempunyai pengalaman dengan NDK, saya tidak fikir anda boleh mengakses konteksnya. Pembangunan NDK adalah untuk prestasi kritikal, prestasi tinggi dan tahap rendah sahaja. Saya cadangkan anda mencari data konfigurasi yang paling kritikal yang anda perlukan dan tulisnya dalam sama ada JSON atau XML dan mengurainya dari kod NDK anda.
Mr.Cool 05/22/2013
@cppdev sekarang saya juga menghadapi masalah yang sama, jika anda telah melaksanakannya, bolehkah anda berkongsi

2 Answers


Lucas S. 12/22/2010.

Tiada apa yang perlu anda lakukan, ia sama seperti mekanisme JNI biasa. Anda perlu mendapatkan penunjuk ke objek konteks, kemudian dapatkan ID kaedah yang anda mahu panggil dan kemudian memanggilnya dengan args yang anda mahu.

Sudah tentu dalam kata-kata ia kedengaran super mudah, tetapi dalam kod itu ia menjadi benar-benar tidak kemas kerana semua cek dan panggilan JNI.

Jadi pada pendapat saya saya tidak akan cuba untuk melaksanakan semua perkara dari kod asal / JNI, sebaliknya saya akan melaksanakan kaedah pembantu di Java yang membuat semua barangan dan hanya menerima data yang diperlukan untuk membaca / menulis keutamaan.

Ini akan mempermudah banyak kod asal anda dan ia akan memudahkan untuk mengekalkan.

contohnya:

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

Perhatikan bahawa saya hanya menulis kod dari ingatan supaya tidak berfungsi daripada kotak.

2 comments
Igor Ganapolsky 04/12/2016
Apakah pembolehubah env ? Adakah konteks yang akan diluluskan dalam Android?
1 aasu 09/08/2016
@IgorGanapolsky Ia tidak perlu dijelaskan secara jelas sebagai hujah dalam panggilan fungsi JNI kerana JVM secara dalaman melaluinya. Lihat en.wikipedia.org/wiki/Java_Native_Interface#How_the_JNI_work s

dev 02/16/2016.

Sepertinya perubahan baru-baru ini dan penyelesaiannya di atas dan beberapa orang lain yang disiarkan di jawatan SO yang lain tidak berfungsi untuk saya. Selepas beberapa kali cuba saya dapat membuat penyelesaian berikut. Matlamat saya adalah untuk menyampaikan Context Object kepada JNI dan mendapatkan laluan penyimpanan mutlak.

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
Saya fikir hujah masuk dalam kedudukan terakhir dalam senarai parameter untuk GetMethodID mengikut GetMethodID g / .... Bagaimanapun, anda lulus contextClass sebagai parameter pertama?

Related questions

Hot questions

Language

Popular Tags