android_app-> activity-> internalDataPath在2.3.8 NDK r8中仍为NULL

时间:2012-05-21 09:58:11

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

要说明我测试的地方,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?

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

1 个答案:

答案 0 :(得分:4)

以下在不使用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();
}