Zugriff auf Android-Kontext in ndk-Anwendung

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

Gibt es irgendeine Weise, in der ich ein Objekt des androiden Kontextes in meiner ndk Anwendung übergeben kann / erhalten kann. Ich möchte SharedPreferences in meiner ndk-Anwendung über die jni-Schnittstelle verwenden. Um eine Instanz des SharedPreferences Objekts SharedPreferences , muss getSharedPreferences() im getSharedPreferences() werden. Aber ich habe keinen Zugriff auf das Kontextobjekt.

ODER

Wie kann ich eine XML-Datei von NDK lesen und schreiben?

Irgendwelche Hinweise werden geschätzt.

3 Comments
ognian 12/15/2010
So lesen und schreiben Sie die XML-Datei: xmlsoft.org
Sebastian Roth 12/15/2010
Obwohl ich keine Erfahrung mit dem NDK habe, glaube ich nicht, dass Sie auf den Kontext zugreifen können. NDK-Entwicklung ist nur für zeitkritische, hohe Leistung und Low-Level-Dinge. Ich schlage vor, dass Sie die wichtigsten Konfigurationsdaten finden, die Sie benötigen, und schreiben Sie sie entweder in JSON oder XML aus und parsen Sie sie aus Ihrem NDK-Code.
Mr.Cool 05/22/2013
@cppdev jetzt habe ich auch das gleiche Problem, wenn Sie dies implementiert haben, können Sie teilen

2 Answers


Lucas S. 12/22/2010.

Es gibt nichts besonderes, das Sie tun müssen, es ist wie ein normaler JNI-Mechanismus. Sie müssen einen Zeiger auf das Kontextobjekt abrufen, dann die Methoden-ID abrufen, die Sie aufrufen möchten, und sie dann mit den gewünschten Argumenten aufrufen.

Natürlich klingt es in Worten super einfach, aber im Code wird es wirklich chaotisch, da alle checks und JNI calls.

Also werde ich meiner Meinung nach nicht versuchen, das Ganze aus nativem / JNI-Code zu implementieren, stattdessen werde ich eine Hilfsmethode in Java implementieren, die all das Zeug macht und nur die benötigten Daten zum Lesen / Schreiben der Präferenz empfängt.

Das wird Ihren nativen Code viel vereinfachen und die Pflege erleichtern.

z.B:

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

Beachten Sie, dass ich den Code nur aus dem Speicher geschrieben habe, also erwarte, dass er nicht funktioniert.

2 comments
Igor Ganapolsky 04/12/2016
Was ist env variabel? Ist ein Context in Android zu übergeben?
1 aasu 09/08/2016
@IgorGanapolsky Es muss nicht explizit als Argument im JNI-Funktionsaufruf übergeben werden, da es von der JVM intern übergeben wird. Siehe de.wikipedia.org/wiki/Java_Native_Interface#How_the_JNI_work s

dev 02/16/2016.

Sieht so aus, als hätten die Dinge in letzter Zeit Änderungen erfahren und die obige Lösung und einige andere, die auf anderen SO-Posts gepostet wurden, funktionierten nicht für mich. Nach einigen Versuchen konnte ich folgende Lösungsarbeit leisten. Mein Ziel war es, Context Object an JNI zu übergeben und den absoluten Speicherpfad zu erhalten.

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
Ich dachte, dass die Argumente an der letzten Stelle in der Parameterliste für GetMethodID laut journals.ecs.soton.ac.uk/java/tutorial/native1.1/implementin g / ... gehen . Sie übergeben jedoch contextClass als ersten Parameter?

Related questions

Hot questions

Language

Popular Tags