Ndk uygulamasında android bağlamına erişme

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

Ndk başvurumda bir android bağlamından geçebileceğim / alabileceğim herhangi bir yol var mı? Ndk uygulamasında jni arayüzü ile SharedPreferences kullanmak istiyorum. SharedPreferences nesnesinin bir örneğini almak için Context nesnesinde getSharedPreferences() gerekir. Ancak içerik nesnesine erişimim yok.

VEYA

NDK'dan bir xml dosyasını nasıl okuyabilir ve yazabilirim?

Herhangi bir işaret takdir edilecektir.

3 Comments
ognian 12/15/2010
Xml dosyası nasıl okunur ve yazılır: xmlsoft.org
Sebastian Roth 12/15/2010
NDK ile hiçbir tecrübeye sahip olmama rağmen, içeriğe erişebileceğinizi düşünmüyorum. NDK geliştirme sadece zaman açısından kritik, yüksek performans ve düşük seviyeli şeyler içindir. İhtiyacınız olan en kritik yapılandırma verilerini bulmanızı ve JSON veya XML'de yazmanızı ve NDK kodunuzdan ayrıştırmanızı öneririm.
Mr.Cool 05/22/2013
@cppdev şimdi ben de aynı sorunu yaşıyorsanız, bunu uyguladıysanız, paylaşabilirsiniz

2 Answers


Lucas S. 12/22/2010.

Yapmanız gereken özel bir şey yok, aynı düzenli JNI mekanizması gibi. Bağlam nesnesine bir işaretçi almanız, ardından aramak istediğiniz yöntem kimliğini almanız ve sonra istediğiniz arşivlerle çağırmanız gerekir.

Tabii ki kelimeler oldukça basit geliyor, ancak kodda, tüm kontroller ve JNI çağrılarından bu yana gerçekten dağınık oluyor.

Benim düşünceme göre, yerel / JNI kodundan bütün bir şeyi uygulamaya çalışmıyorum, bunun yerine Java'da her şeyi yapan ve sadece tercihleri ​​okumak / yazmak için gereken verileri alan bir yardımcı metodu uygulayacağım.

Bu, yerel kodunuzu çok basitleştirecek ve bakımı daha kolay hale getirecektir.

Örneğin:

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

Kodu sadece bellekten yazdığımı unutmayın, bu yüzden kutudan çıkmamaya çalışın.

2 comments
Igor Ganapolsky 04/12/2016
env değişkeni nedir? Android'de Geçirilecek Bir İçerik mi?
1 aasu 09/08/2016
@IgorGanapolsky JVM işlev çağrısında açık bir şekilde bir argüman olarak geçilmesine gerek yoktur, çünkü JVM dahili olarak geçer. En.wikipedia.org/wiki/Java_Native_Interface#How_the_JNI_work‌ s sayfasına bakın.

dev 02/16/2016.

Son zamanlarda işler değişmiş gibi görünüyor ve yukarıdaki çözüm ve diğer SO gönderilerinde yayınlanmış birkaç kişi benim için çalışmadı. Birkaç denemeden sonra aşağıdaki çözüm işini yapabildim. Amacım Bağlam Nesnesini JNI'ye aktarmak ve mutlak saklama yolunu almaktı.

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
Ben tartışmalar GetMethodID için parametreler listesinde son pozisyonda GetMethodID g /… ' GetMethodID göre GetMethodID . Ancak, contextClass ilk parametre olarak mı contextClass ?

Related questions

Hot questions

Language

Popular Tags