2012-05-21 10 views
6

Geben Sie auf, wo ich dies getestet, HTC Desire S, Android 2.3.5 und ndk-r8.android_app-> activity-> internalDataPath noch NULL in 2.3.8 NDK r8

Ich habe Probleme in ndk-r7b und in ndk-r8 Zugriff auf die lokalen Lese-Verzeichnisse unter Verwendung von android_app-> activity-> InternalDataPath oder ExternalDataPath, da beide NULL sind. Ich sehe, dass dies in früheren Versionen veröffentlicht worden und ein Update würde dies nach diesem Beitrag beheben: -

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

Jetzt vielleicht dies wird in Ice Cream Sandwich fixiert, aber das ist bei weitem nicht ideal, wie mein Werkzeug Die Kette unterstützt die Rückwärtskompatibilität perfekt, um diejenigen zu fangen, die nicht updaten. Also meine Frage ist, gibt es eine bekannte Lösung oder muss ich die Verzeichnisstruktur wie "/data/data/com.example.mytest/files/somefile.dat" manuell hinzufügen, bis es behoben ist?

+0

Haben Sie jemals eine Lösung für dieses Problem finden? –

Antwort

4

Folgende Werke von NDK ohne Verwendung von 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(); 
} 
+0

Dank Phoenix hatte ich noch keine Gelegenheit, darauf zurück zu kommen, aber ja, Ihr Recht, JNI zu verwenden, um den Hauptdatenpfad zu greifen, ist der richtige Weg und auch, wie ich es behoben habe. – Dev2rights