Akses konteks android di aplikasi ndk

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

Apakah ada cara di mana saya bisa lewat / mendapatkan objek konteks android di aplikasi ndk saya. Saya ingin menggunakan SharedPreferences di aplikasi ndk saya melalui antarmuka jni. Untuk mendapatkan instance dari objek SharedPreferences , saya perlu memanggil getSharedPreferences() pada objek Context . Tetapi saya tidak memiliki akses ke objek konteks.

ATAU

Bagaimana saya bisa membaca dan menulis file xml dari NDK?

Setiap pointer akan dihargai.

3 Comments
ognian 12/15/2010
Cara membaca dan menulis file xml: xmlsoft.org
Sebastian Roth 12/15/2010
Meskipun tidak memiliki pengalaman dengan NDK, saya tidak berpikir Anda dapat mengakses konteksnya. Pengembangan NDK hanya untuk waktu kritis, kinerja tinggi, dan hal-hal tingkat rendah. Saya sarankan Anda menemukan data konfigurasi paling penting yang Anda butuhkan dan tuliskan baik dalam JSON atau XML dan parse dari kode NDK Anda.
Mr.Cool 05/22/2013
@cppdev sekarang saya juga menghadapi masalah yang sama ini, jika Anda telah menerapkan ini, dapat Anda bagikan

2 Answers


Lucas S. 12/22/2010.

Tidak ada yang istimewa yang harus Anda lakukan, sama seperti mekanisme JNI biasa. Anda perlu mendapatkan penunjuk ke objek konteks, lalu mengambil ID metode yang ingin Anda panggil dan kemudian memanggilnya dengan argumen yang Anda inginkan.

Tentu saja dengan kata-kata kedengarannya sangat lugas, tetapi dalam kode itu menjadi sangat berantakan karena semua pemeriksaan dan panggilan JNI.

Jadi menurut saya saya tidak akan mencoba untuk mengimplementasikan semuanya dari kode native / JNI, sebagai gantinya saya akan mengimplementasikan metode pembantu di Java yang membuat semua barang dan hanya menerima data yang diperlukan untuk membaca / menulis preferensi.

Itu akan menyederhanakan banyak kode asli Anda dan itu akan membuatnya lebih mudah untuk dipelihara.

misalnya:

//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 bahwa saya baru saja menulis kode dari memori sehingga berharap tidak bekerja di luar kotak.

2 comments
Igor Ganapolsky 04/12/2016
Apa itu variabel env ? Apakah itu Konteks yang akan disahkan di Android?
1 aasu 09/08/2016
@IgorGanapolsky Tidak perlu secara eksplisit dilewatkan sebagai argumen dalam panggilan fungsi JNI karena JVM secara internal melewatinya. Lihat en.wikipedia.org/wiki/Java_Native_Interface#How_the_JNI_work‌ s

dev 02/16/2016.

Sepertinya hal-hal telah berubah baru-baru ini dan solusi di atas dan beberapa orang lain diposting di posting SO lain tidak bekerja untuk saya. Setelah beberapa kali mencoba, saya dapat membuat solusi berikut bekerja. Tujuan saya adalah untuk melewati Objek Konteks ke JNI dan mendapatkan jalur penyimpanan absolut.

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 pikir argumen masuk ke posisi terakhir dalam daftar parameter untuk GetMethodID menurut GetMethodID g /… . Namun, Anda melewatkan contextClass sebagai parameter pertama?

Related questions

Hot questions

Language

Popular Tags