Tilgang android kontekst i ndk applikasjon

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

Er det noen måte at jeg kan passere / få et objekt av android sammenheng i min ndk applikasjon. Jeg vil bruke SharedPreferences i min ndk-applikasjon via jni-grensesnittet. For å få en forekomst av SharedPreferences objekt, må jeg ringe getSharedPreferences()Context Object. Men jeg har ikke tilgang til kontekstobjektet.

ELLER

Hvordan kan jeg lese og skrive en xml-fil fra NDK?

Eventuelle poeng vil bli verdsatt.

3 Comments
ognian 12/15/2010
Slik leser og skriver du xml-filen: xmlsoft.org
Sebastian Roth 12/15/2010
Selv om jeg ikke har erfaring med NDK, tror jeg ikke du kan få tilgang til konteksten. NDK-utvikling er kun for tidskritisk, høy ytelse og kun lavt nivå. Jeg foreslår at du finner de mest kritiske konfigurasjonsdataene du trenger, og skriv den ut i enten JSON eller XML, og analyser den fra NDK-koden din.
Mr.Cool 05/22/2013
@cppdev nå står jeg også overfor det samme problemet, hvis du har implementert dette, kan du dele

2 Answers


Lucas S. 12/22/2010.

Det er ikke noe spesielt du må gjøre, det er akkurat som vanlig JNI-mekanisme. Du må få pekeren til kontekstobjektet, og hent deretter metoden ID-en du vil ringe og deretter påkalle den med args du vil ha.

Selvfølgelig i ord det høres veldig greit ut, men i kode blir det virkelig rotete siden alle kontrollene og JNI ringer.

Så etter min mening vil jeg ikke forsøke å implementere hele greia fra innfødt / JNI-kode, men jeg vil i stedet implementere en hjelpemetode i Java som lager alle ting og bare mottar de nødvendige dataene for å lese / skrive inn preferansen.

Det vil forenkle mye din innfødte kode og det vil gjøre det enklere å vedlikeholde.

f.eks:

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

Legg merke til at jeg bare skrev koden fra minnet, forventer ikke å trene ut av boksen.

2 comments
Igor Ganapolsky 04/12/2016
Hva er env variabel? Er det en kontekst som skal sendes i Android?
1 aasu 09/08/2016
@IgorGanapolsky Det behøver ikke å bli eksplisitt bestått som et argument i JNI-funksjonsanropet fordi JVM internt passerer det. Se en.wikipedia.org/wiki/Java_Native_Interface#How_the_JNI_work s

dev 02/16/2016.

Ser ut som ting har endret seg nylig, og løsningen ovenfor og få andre som ble lagt ut på andre SO-innlegg fungerte ikke for meg. Etter få forsøk var jeg i stand til å gjøre følgende løsningsarbeid. Målet mitt var å sende Context Object til JNI og få absolutt lagringsbane.

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
Jeg trodde at argumenter går i siste posisjon i parameterlisten for GetMethodID henhold til journals.ecs.soton.ac.uk/java/tutorial/native1.1/implementin g / .... Men passerer du contextClass som den første parameteren?

Related questions

Hot questions

Language

Popular Tags