Få tillgång till android-kontext i ndk-applikation

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

Finns det något sätt på vilket jag kan skicka / få ett objekt av android-sammanhang i min ndk-applikation. Jag vill använda SharedPreferences i min ndk-applikation via jni-gränssnittet. För att få en förekomst av SharedPreferences objekt behöver jag ringa getSharedPreferences()Context Object. Men jag har inte tillgång till kontextobjektet.

ELLER

Hur kan jag läsa och skriva en xml-fil från NDK?

Eventuella tips kommer att uppskattas.

3 Comments
ognian 12/15/2010
Hur man läser och skriver xml-fil: xmlsoft.org
Sebastian Roth 12/15/2010
Medan du inte har någon erfarenhet av NDK tror jag inte att du kan komma åt kontexten. NDK-utveckling är endast för tidskritisk, högpresterande och lågnivå. Jag föreslår att du hittar de mest kritiska konfigurationsdata du behöver och skriver den ut i antingen JSON eller XML och analysera den från din NDK-kod.
Mr.Cool 05/22/2013
@cppdev nu står jag också inför samma problem, om du har implementerat detta kan du dela

2 Answers


Lucas S. 12/22/2010.

Det finns inget speciellt du behöver göra, det är precis som vanlig JNI-mekanism. Du måste få en pekare till kontextobjektet och hämta sedan metod-id som du vill ringa och sedan anropa det med de args du vill ha.

Självklart i ord låter det väldigt enkelt, men i kod blir det riktigt rörigt eftersom alla kontroller och JNI ringer.

Så jag tror inte att jag kommer att försöka implementera hela saken från inbyggd / JNI-kod, istället kommer jag att implementera en hjälparmetod i Java som gör alla saker och bara tar emot nödvändiga data för att läsa / skriva preferensen.

Det kommer att förenkla din kod och det kommer att underlätta underhållet.

t.ex:

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

Observera att jag bara skrev koden från minnet så förvänta mig att inte träna i rutan.

2 comments
Igor Ganapolsky 04/12/2016
Vad är env variabel? Är det en kontext som ska skickas i Android?
1 aasu 09/08/2016
@IgorGanapolsky Det behöver inte uttryckligen överföras som ett argument i JNI-funktionssamtalet eftersom JVM internt passerar det. Se en.wikipedia.org/wiki/Java_Native_Interface#How_the_JNI_work s

dev 02/16/2016.

Det verkar som att saker har förändrats nyligen och lösningen ovan och få andra som postat på andra SO-inlägg fungerade inte för mig. Efter några försök kunde jag göra följande lösningsarbete. Mitt mål var att skicka Context Object till JNI och få den absoluta lagringsbanan.

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
Jag trodde att argument går i det sista läget i parameterlistan för GetMethodID enligt journals.ecs.soton.ac.uk/java/tutorial/native1.1/implementin g / .... Men passerar du contextClass som den första parametern?

Related questions

Hot questions

Language

Popular Tags