【问题标题】:Access android context in ndk application在 ndk 应用程序中访问 android 上下文
【发布时间】:2011-05-25 21:25:14
【问题描述】:

有什么方法可以在我的 ndk 应用程序中传递/获取 android 上下文对象。我想通过 jni 接口在我的 ndk 应用程序中使用SharedPreferences。要获得SharedPreferences 对象的实例,我需要在Context 对象上调用getSharedPreferences()。但我无权访问上下文对象。

如何从 NDK 读取和写入 xml 文件?

任何指针将不胜感激。

【问题讨论】:

  • 如何读写xml文件:xmlsoft.org
  • 虽然没有使用 NDK 的经验,但我认为您无法访问上下文。 NDK 开发只针对时间关键、高性能和低级的东西。我建议你找到你需要的最关键的配置数据,用 JSON 或 XML 写出来,然后从你的 NDK 代码中解析出来。
  • @cppdev 现在我也遇到了同样的问题,如果你实现了,可以分享一下

标签: android android-ndk


【解决方案1】:

没有什么特别需要做的,就像普通的 JNI 机制一样。您需要获取指向上下文对象的指针,然后检索要调用的方法 ID,然后使用所需的 args 调用它。

当然,在语言中这听起来非常简单,但在代码中它变得非常混乱,因为所有的检查和 JNI 调用。

所以在我看来,我不会尝试从本机/JNI 代码实现整个事情,而是我将在 Java 中实现一个辅助方法,它可以制作所有东西,并且只接收读取/写入首选项所需的数据。

这将大大简化您的本机代码,并使其更易于维护。

例如:

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

请注意,我只是从内存中编写代码,所以不要开箱即用。

【讨论】:

【解决方案2】:

看起来事情最近发生了变化,上面的解决方案和其他 SO 帖子上发布的其他解决方案对我不起作用。经过几次尝试,我能够使以下解决方案起作用。我的目标是将 Context Object 传递给 JNI 并获得绝对存储路径。

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

【讨论】:

猜你喜欢
  • 2018-10-12
  • 2011-09-13
  • 2022-09-30
  • 2011-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多