为了说明我在哪里测试了这个,HTC Desire S,Android 2.3.5和ndk-r8。
我在 ndk-r7b 和 ndk-r8 中使用 android_app->activity->internalDataPath 或 externalDataPath 访问本地读写目录时遇到问题,因为它们都是 NULL。我看到这已在以前的版本中发布,并且根据这篇文章,更新将解决此问题:-
如何使用 NativeActivity 写入内部存储文件系统?
现在也许这在冰淇淋三明治中得到了修复,但这远非理想,因为我的工具链完美地支持向后兼容性,以抓住那些不更新的人。所以我的问题是是否有已知的修复程序,或者我是否必须手动添加目录结构,例如"/data/data/com.example.mytest/files/somefile.dat"直到修复?
以下 NDK 不使用 Java 即可使用:
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();
}