Accedi al contesto Android nell'applicazione ndk

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

C'è un modo in cui posso passare / ottenere un oggetto di contesto Android nella mia applicazione ndk. Voglio usare SharedPreferences nella mia applicazione ndk tramite interfaccia jni. Per ottenere un'istanza dell'oggetto SharedPreferences , ho bisogno di chiamare getSharedPreferences() sull'oggetto Context . Ma non ho accesso all'oggetto di contesto.

O

Come posso leggere e scrivere un file xml da NDK?

Ogni suggerimento sarà apprezzato.

3 Comments
ognian 12/15/2010
Come leggere e scrivere il file xml: xmlsoft.org
Sebastian Roth 12/15/2010
Pur non avendo esperienza con NDK, non penso che tu possa accedere al contesto. Lo sviluppo di NDK è solo per le attività a tempo critico, ad alte prestazioni e di basso livello. Ti suggerisco di trovare i dati di configurazione più importanti di cui hai bisogno e di scriverlo in JSON o XML e analizzarlo dal tuo codice NDK.
Mr.Cool 05/22/2013
@ cppdev ora devo affrontare anche questo stesso problema, se hai implementato questo, puoi condividere

2 Answers


Lucas S. 12/22/2010.

Non c'è niente di speciale che devi fare, è proprio come un normale meccanismo JNI. È necessario ottenere un puntatore all'oggetto contesto, quindi recuperare l'ID del metodo che si desidera chiamare e quindi richiamarlo con gli argomenti che si desidera.

Ovviamente a parole sembra molto semplice, ma nel codice diventa davvero complicato da quando tutti i controlli e le chiamate JNI.

Quindi, a mio parere, non cercherò di implementare il tutto dal codice nativo / JNI, ma implementerò un metodo di supporto in Java che rende tutto e solo i dati necessari per leggere / scrivere la preferenza.

Ciò semplificherà molto il tuo codice nativo e renderà più semplice la manutenzione.

per esempio:

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

Nota che ho appena scritto il codice dalla memoria quindi non aspettarti di lavorare fuori dalla scatola.

2 comments
Igor Ganapolsky 04/12/2016
Cos'è la variabile env ? È un passato da passare in Android?
1 aasu 09/08/2016
@IgorGanapolsky Non è necessario che venga passato esplicitamente come argomento nella chiamata della funzione JNI perché la JVM lo passa internamente. Vedi en.wikipedia.org/wiki/Java_Native_Interface#How_the_JNI_work s

dev 02/16/2016.

Sembra che le cose siano cambiate di recente e la soluzione sopra e poche altre postate su altri post SO non ha funzionato per me. Dopo alcuni tentativi, sono riuscito a far funzionare la seguente soluzione. Il mio obiettivo era passare Oggetto Contesto a JNI e ottenere il percorso di archiviazione assoluto.

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
Ho pensato che gli argomenti andassero nell'ultima posizione nell'elenco dei parametri per GetMethodID base a journals.ecs.soton.ac.uk/java/tutorial/native1.1/implementin g / .... Tuttavia, stai passando contextClass come primo parametro?

Related questions

Hot questions

Language

Popular Tags