7

これをテストした場所の仕様を示すために、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」のようなディレクトリ構造を手動で追加する必要がありますか?

4

1 に答える 1

5

以下は、Java を使用せずに NDK から機能します。

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();
}
于 2013-08-23T18:47:22.407 に答える