Search code examples
androidandroid-ndkandroid-ndk-r7

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


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 ?


Solution

  • 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();
    }