I-access ang konteksto sa android sa ndk application

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

Mayroon bang anumang paraan kung saan maaari ako pumasa / makakuha ng isang bagay ng Android konteksto sa aking ndk appliation. Gusto kong gamitin ang SharedPreferences sa aking ndk application sa pamamagitan ng jni interface. Upang makakuha ng isang halimbawa ng object na SharedPreferences , kailangan kong tawagan ang getSharedPreferences() sa Context object. Ngunit wala akong access sa object na konteksto.

O

Paano ko mabasa at makapagsulat ng isang xml file mula sa NDK?

Anumang mga payo ay pinapahalagahan.

3 Comments
ognian 12/15/2010
Paano magbasa at magsulat ng xml file: xmlsoft.org
Sebastian Roth 12/15/2010
Habang walang karanasan sa NDK, sa palagay ko ay hindi mo ma-access ang konteksto. Ang pag-unlad ng NDK ay para lamang sa oras-kritikal, mataas na pagganap at mababang antas ng mga bagay. Iminumungkahi ko sa iyo na mahanap ang pinaka-kritikal na data configuration na kailangan mo at isulat ito sa alinman sa JSON o XML at i-parse ito mula sa iyong NDK code.
Mr.Cool 05/22/2013
@ cppdev ngayon ako din mukha ang parehong problema, kung ipinatupad mo ito, maaari mong ibahagi

2 Answers


Lucas S. 12/22/2010.

Walang espesyal na kailangan mong gawin, tulad ng regular na mekanismo ng JNI. Kailangan mong makakuha ng isang pointer sa object ng konteksto, pagkatapos ay kunin ang ID ng paraan na nais mong tawagan at pagkatapos ay tumawag sa iyo ng args na gusto mo.

Of course sa mga salita ito tunog sobrang direkta, ngunit sa code na ito ay makakakuha ng talagang makalat dahil ang lahat ng mga tseke at JNI tawag.

Kaya sa palagay ko hindi ko susubukan na ipatupad ang buong bagay mula sa katutubong / JNI code, sa halip ay ipapatupad ko ang isang paraan ng helper sa Java na gumagawa ng lahat ng mga bagay at tumanggap lamang ng kinakailangang data upang mabasa / isulat ang kagustuhan.

Iyan ay gawing simple ang iyong katutubong code at ito ay gawing mas madali upang mapanatili.

halimbawa:

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

Tandaan na isinulat ko lang ang code mula sa memorya kaya inaasahan na hindi magtrabaho sa labas ng kahon.

2 comments
Igor Ganapolsky 04/12/2016
Ano ang env variable? Ay isang Konteksto na maipasa sa Android?
1 aasu 09/08/2016
@IgorGanapolsky Hindi na kailangang ipaliwanag nang malinaw ang isang argumento sa tawag sa pag-andar ng JNI dahil ang JVM ay pumasa sa loob nito. Tingnan ang en.wikipedia.org/wiki/Java_Native_Interface#How_the_JNI_work s

dev 02/16/2016.

Mukhang mga bagay na may mga pagbabago kamakailan at ang solusyon sa itaas at ilang iba pa na nai-post sa iba pang mga post na SO ay hindi gumagana para sa akin. Matapos ang ilang pagsubok ay nakagawa ako ng sumusunod na solusyon sa trabaho. Ang aking layunin ay upang ipasa ang Context Object sa JNI at makakuha ng ganap na landas sa imbakan.

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
Akala ko ang mga argumento ay pumunta sa huling posisyon sa listahan ng mga parameter para sa GetMethodID ayon sa journals.ecs.soton.ac.uk/java/tutorial/native1.1/implementin g / .... Gayunpaman, contextClass mo ang contextClass bilang unang parameter?

Related questions

Hot questions

Language

Popular Tags