android_app->activity->internalDataPath still NULL in 2.3.8 NDK r8

二次信任 提交于 2019-12-03 14:37:53

问题


To give spec on where i tested this, HTC Desire S, Android 2.3.5 and ndk-r8.

I am having issues in ndk-r7b and in ndk-r8 accessing the local read write directories using android_app->activity->internalDataPath or externalDataPath as they are both NULL. I see that this has been posted in previous versions and an update was going to fix this according to this post:-

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

Now perhaps this gets fixed in Ice Cream Sandwich but that's far from ideal as my tool chain supports backwards compatibility perfectly to catch those who don't update. So my question is is there a known fix or do i have to manually add the directory structure like "/data/data/com.example.mytest/files/somefile.dat" untill its fixed ?


回答1:


The following works from NDK without use of 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();
}


来源:https://stackoverflow.com/questions/10683119/android-app-activity-internaldatapath-still-null-in-2-3-8-ndk-r8

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!