Uzyskaj dostęp do kontekstu Androida w aplikacji ndk

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

Czy istnieje sposób, w jaki mogę przekazać / uzyskać obiekt kontekstu Android w mojej aplikacji ndk. Chcę używać SharedPreferences w mojej aplikacji ndk za pośrednictwem interfejsu jni. Aby uzyskać wystąpienie obiektu getSharedPreferences() , należy wywołać getSharedPreferences() w obiekcie Context . Ale nie mam dostępu do obiektu kontekstu.

LUB

Jak mogę odczytać i napisać plik xml z NDK?

Wszelkie wskazówki zostaną docenione.

3 Comments
ognian 12/15/2010
Jak czytać i pisać plik xml: xmlsoft.org
Sebastian Roth 12/15/2010
Nie mając doświadczenia z NDK, nie sądzę, abyś miał dostęp do kontekstu. Rozwój NDK ma charakter wyłącznie czasowy, o wysokiej wydajności i niskim poziomie. Sugeruję, aby znaleźć najbardziej niezbędne dane konfiguracyjne i zapisać je w JSON lub XML i przeanalizować je za pomocą kodu NDK.
Mr.Cool 05/22/2013
@ cppdev teraz też mam do czynienia z tym samym problemem, jeśli to zaimplementowałeś, możesz udostępniać

2 Answers


Lucas S. 12/22/2010.

Nie ma nic szczególnego, co musisz zrobić, to jest jak zwykły mechanizm JNI. Musisz pobrać wskaźnik do obiektu kontekstowego, a następnie pobrać identyfikator metody, do którego chcesz zadzwonić, a następnie wywołać go z żądanymi argami.

Oczywiście w słowach brzmi to bardzo prosto, ale w kodzie robi się naprawdę chaotycznie, ponieważ wszystkie kontrole i wywołania JNI.

Tak więc, moim zdaniem, nie będę starał się zaimplementować całej rzeczy z natywnego kodu / JNI, zamiast tego zaimplementuję w Javie metodę helpera, która tworzy wszystkie rzeczy i po prostu otrzymuje potrzebne dane do odczytu / zapisu preferencji.

To znacznie uprości twój natywny kod i ułatwi to utrzymanie.

na przykład:

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

Zauważ, że właśnie napisałem kod z pamięci, więc spodziewaj się, że nie wyjdziesz z pudełka.

2 comments
Igor Ganapolsky 04/12/2016
Czym jest zmienna env ? Czy kontekst w Androidzie jest przekazywany?
1 aasu 09/08/2016
@IgorGanapolsky Nie musi być jawnie przekazywany jako argument w wywołaniu funkcji JNI, ponieważ JVM wewnętrznie je przekazuje. Zobacz en.wikipedia.org/wiki/Java_Native_Interface#How_the_JNI_work s

dev 02/16/2016.

Wygląda na to, że ostatnio coś się zmieniło, a powyższe rozwiązanie i kilka innych opublikowanych w innych wpisach SO nie działa dla mnie. Po kilku próbach udało mi się wykonać następujące rozwiązanie. Moim celem było przekazanie obiektu kontekstowego do JNI i uzyskanie absolutnej ścieżki do przechowywania.

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
Myślałem, że argumenty idą w ostatniej pozycji na liście parametrów GetMethodID zgodnie z GetMethodID g / .... Jednakże przekazujesz contextClass jako pierwszy parametr?

Related questions

Hot questions

Language

Popular Tags