android_app-> активность->internalDataPath по-прежнему NULL в 2.3.8 NDK r8
Чтобы узнать, где я это тестировал, HTC Desire S, Android 2.3.5 и ndk-r8.
У меня есть проблемы в ndk-r7b и в ndk-r8 при доступе к локальным каталогам чтения и записи с помощью android_app->activity->internalDataPath или externalDataPath, поскольку они оба имеют значение NULL. Я вижу, что это было опубликовано в предыдущих версиях, и обновление собиралось исправить это согласно этому сообщению:-
Как мне записать во внутреннюю файловую систему хранилища с NativeActivity?
Теперь, возможно, это исправлено в Ice Cream Sandwich, но это далеко не идеально, так как моя цепочка инструментов отлично поддерживает обратную совместимость, чтобы ловить тех, кто не обновляется. Итак, мой вопрос: есть ли известное исправление или мне нужно вручную добавить структуру каталогов, например "/data/data/com.example.mytest/files/somefile.dat", пока она не будет исправлена?
1 ответ
Следующее работает от 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();
}