Käytä android kontekstia ndk-sovelluksessa

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

Onko minkäänlaista tapaa, jolla voin siirtää / saada Android-kontekstin objektin minun ndk-sovelluksessani. Haluan käyttää SharedPreferences minun ndk-sovelluksestani jni-käyttöliittymän kautta. Jotta saat SharedPreferences objektin getSharedPreferences() , minun on kutsuttava getSharedPreferences() Context objektille. Mutta minulla ei ole pääsyä kontekstiohjelmaan.

TAI

Kuinka voin lukea ja kirjoittaa xml-tiedosto NDK: lta?

Kaikki osoittimet ovat arvokkaita.

3 Comments
ognian 12/15/2010
Miten lukea ja kirjoittaa xml-tiedostoa: xmlsoft.org
Sebastian Roth 12/15/2010
Vaikka sinulla ei ole kokemusta NDK: sta, en usko, että voit käyttää asiayhteyttä. NDK-kehitys on vain ajallisesti kriittistä, suorituskykyistä ja matalan tason. Ehdotan, että löydät kriittisimmät kokoonpanotiedot ja kirjoitat sen joko JSON: in tai XML: n kautta ja jäsennät sen NDK-koodista.
Mr.Cool 05/22/2013
@cppdev nyt olen myös sama ongelma, jos olet toteuttanut tämän, voitko jakaa

2 Answers


Lucas S. 12/22/2010.

Sinulla ei ole mitään erikoista, se on kuin säännöllinen JNI-mekanismi. Sinun on saatava osoitekirja konteksti-objektille, hakea sen jälkeen metodin tunnus, jonka haluat soittaa, ja sitten kutsua sitä haluamiesi argumenttien avulla.

Tietenkin sanoin se kuulostaa suoraviivaiselta, mutta koodissa se todella sekaantuu, koska kaikki tarkistukset ja JNI soittaa.

Joten mielestäni en yritä toteuttaa koko asiaa alkuperäisestä / JNI-koodista, vaan panen täytäntöön helper-menetelmän Java, joka tekee kaikki tavarat ja vain vastaanottaa tarvittavat tiedot lukea / kirjoittaa preference.

Tämä yksinkertaistaa paljon alkuperäisen koodin ja se helpottaa ylläpitämistä.

esim:

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

Huomaa, että kirjoitin vain koodin muistiin, joten odottaisitteko, ettet työskentele laatikosta.

2 comments
Igor Ganapolsky 04/12/2016
Mikä on env muuttuja? Onko konteksti luovutettava Androidissa?
1 aasu 09/08/2016
@IgorGanapolsky Tätä ei tarvitse eksplisiittisesti siirtää argumenttina JNI-toiminnon puhelun aikana, koska JVM siirtää sen sisäisesti. Katso en.wikipedia.org/wiki/Java_Native_Interface#How_the_JNI_work s

dev 02/16/2016.

Näyttää siltä, ​​että asiat ovat äskettäin muuttuneet, ja yllä oleva ratkaisu ja muutamat muut julkaisut muille SO-toimille eivät toimineet minulle. Muutaman yrittämän jälkeen pystyi tekemään ratkaisutöitä. Tavoitteeni oli siirtää Context Object JNI: lle ja saada absoluuttinen tallennuspolku.

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
Ajattelin, että argumentit menevät viimeiseen asemaan GetMethodID parametrien luettelossa journals.ecs.soton.ac.uk/java/tutorial/native1.1/implementin g / ... mukaan . Olet kuitenkin kulkemassa contextClass ensimmäisenä parametrina?

Related questions

Hot questions

Language

Popular Tags