Toegang tot android-context in ndk-applicatie

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

Is er een manier waarop ik een object van android-context kan doorgeven / krijgen in mijn ndk-applicatie. Ik wil SharedPreferences in mijn ndk-applicatie via jni-interface. Om een ​​exemplaar van SharedPreferences object te krijgen, moet ik getSharedPreferences() aanroepen bij het Context object. Maar ik heb geen toegang tot het contextobject.

OF

Hoe kan ik een XML-bestand van NDK lezen en schrijven?

Alle wijzers worden op prijs gesteld.

3 Comments
ognian 12/15/2010
Hoe xml-bestand te lezen en te schrijven: xmlsoft.org
Sebastian Roth 12/15/2010
Hoewel ik geen ervaring heb met de NDK, denk ik niet dat je toegang hebt tot de context. NDK-ontwikkeling is alleen voor tijdkritische, krachtige en low-level dingen. Ik stel voor dat u de meest kritieke configuratiegegevens vindt die u nodig hebt en deze in JSON of XML wegschrijven en van uw NDK-code ontleden.
Mr.Cool 05/22/2013
@cppdev nu heb ik ook met hetzelfde probleem te maken, als je dit hebt geïmplementeerd, kun je het delen

2 Answers


Lucas S. 12/22/2010.

Er is niets speciaals wat je moet doen, het is net als een gewoon JNI-mechanisme. U moet een verwijzing naar het contextobject krijgen, vervolgens de methode-ID ophalen die u wilt aanroepen en deze vervolgens aanroepen met de args die u wilt.

Natuurlijk klinkt het in woorden supereenvoudig, maar in code wordt het echt rommelig sinds alle cheques en JNI oproepen.

Dus naar mijn mening zal ik niet proberen om het hele ding uit de native / JNI-code te implementeren, in plaats daarvan zal ik een helper-methode in Java implementeren die alle spullen maakt en gewoon de benodigde gegevens ontvangt om de voorkeur te lezen / schrijven.

Dat zal uw native code aanzienlijk vereenvoudigen en het onderhoud ervan gemakkelijker maken.

bijvoorbeeld:

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

Merk op dat ik de code zojuist uit het geheugen heb geschreven, dus verwacht niet uit de doos te werken.

2 comments
Igor Ganapolsky 04/12/2016
Wat is env variabele? Is het een context die moet worden doorgegeven in Android?
1 aasu 09/08/2016
@IgorGanapolsky Het hoeft niet expliciet te worden doorgegeven als argument in de JNI-functieaanroep omdat de JVM het intern doorgeeft. Zie en.wikipedia.org/wiki/Java_Native_Interface#How_the_JNI_work s

dev 02/16/2016.

Het lijkt erop dat dingen recentelijk veranderingen hebben ondergaan en de oplossing hierboven en enkele anderen die op andere SO-berichten zijn geplaatst, werkten niet voor mij. Na enkele pogingen kon ik de volgende oplossing laten werken. Mijn doel was om Context Object door te geven aan JNI en een absoluut opslagpad te krijgen.

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
Ik dacht dat de argumenten in de laatste positie in de lijst met parameters voor GetMethodID volgens journals.ecs.soton.ac.uk/java/tutorial/native1.1/implementin g / .... U geeft echter contextClass als de eerste parameter?

Related questions

Hot questions

Language

Popular Tags