【问题标题】:android_app->activity->internalDataPath still NULL in 2.3.8 NDK r8android_app->activity->internalDataPath 在 2.3.8 NDK r8 中仍然为 NULL
【发布时间】:2012-05-27 19:51:55
【问题描述】:

为了说明我在哪里测试,HTC Desire S、Android 2.3.5 和 ndk-r8。

我在 ndk-r7b 和 ndk-r8 中使用 android_app->activity->internalDataPath 或 externalDataPath 访问本地读写目录时遇到问题,因为它们都是 NULL。我看到这已在以前的版本中发布,并且根据此帖子更新将解决此问题:-

How do I write to the internal storage file system with NativeActivity?

现在也许这在 Ice Cream Sandwich 中得到了修复,但这远非理想,因为我的工具链完美地支持向后兼容性以捕捉那些不更新的人。所以我的问题是有一个已知的修复还是我必须手动添加像“/data/data/com.example.mytest/files/somefile.dat”这样的目录结构,直到它修复?

【问题讨论】:

  • 您找到解决此问题的方法了吗?

标签: android android-ndk android-ndk-r7


【解决方案1】:

以下不使用 Java 的 NDK 工作:

const char* path = app->activity->internalDataPath;
if (!path) {
    JNIEnv* jni;
    app->activity->vm->AttachCurrentThread(&jni, NULL);

    jclass activityClass = jni->GetObjectClass(app->activity->clazz);
    jmethodID getFilesDir = jni->GetMethodID(activityClass, "getFilesDir", "()Ljava/io/File;");
    jobject fileObject = jni->CallObjectMethod(app->activity->clazz, getFilesDir);
    jclass fileClass = jni->GetObjectClass(fileObject);
    jmethodID getAbsolutePath = jni->GetMethodID(fileClass, "getAbsolutePath", "()Ljava/lang/String;");
    jobject pathObject = jni->CallObjectMethod(fileObject, getAbsolutePath);
    path = jni->GetStringUTFChars((jstring)pathObject, NULL);

    jni->DeleteLocalRef(pathObject);
    jni->DeleteLocalRef(fileClass);
    jni->DeleteLocalRef(fileObject);
    jni->DeleteLocalRef(activityClass);

    app->activity->vm->DetachCurrentThread();
}

【讨论】:

  • 感谢 phoenix,我没有机会回到这个问题上,但是是的,您使用 JNI 获取主数据路径的权利是正确的路线,也是我修复它的方式。
猜你喜欢
  • 1970-01-01
  • 2016-09-30
  • 1970-01-01
  • 2012-07-27
  • 2012-06-08
  • 1970-01-01
  • 2014-07-01
  • 2012-08-05
  • 1970-01-01
相关资源
最近更新 更多