Файл записи NDK для Android

Есть ли другой способ написать файл где-то еще, чем на SD-карте?

Я пробовал много разных путей в файловой системе, но fopen всегда возвращает NULL, за исключением любого файла, который я пишу/читаю внутри /sdcard/...

Есть ли что-то еще эквивалентное:

Это позволяет вам писать как в файловой системе, так и что-то еще?

Ответ 1

  • Вы всегда можете получить доступ к каталогу в котором размещено ваше приложение.

    Этот каталог обычно:

    data/data/<Your_package_name_usually com.android.appName>/files/<your_filename>

    но лучше использовать getFilesDir() для обеспечить действительный путь к файлу с будущим версии андроида.

  • Если вы хотите использовать внешнее хранилище вместо этого убедитесь, что вы поместите это строка кода в манифесте приложения получить разрешение.

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    

    Затем используйте каталог sdcard:

    getExternalStorageDirectory(); //usually : /sdcard/<your_filename>

  • В противном случае вы можете подключить устройство и получить доступ ко всему файловая система. Но вам придется попросите всех пользователей вашего приложения получить доступа root на своем устройстве до используя ваше приложение. Некоторые игры используйте этот способ делать что-то, но я не рекомендовал бы это. Если вы все еще хочу сделать это, искать Superuser приложение для Android, оно бесплатно и надёжная.

Как только у вас есть каталог Android, просто создайте собственный метод JNI, который получит параметр jstring, и вы установите его внутри своего собственного кода. Преобразуйте его в std::string, и вы будете готовы использовать его с fopen().

//Inside your java activity
File f = this.getApplicationContext().getFilesDir(); 
LibLoader.setupArchiveDir(f.toString());

//Inside your JNI wrapper
JNIEXPORT bool JNICALL Java_com_android_appName_LibLoader_setupArchiveDir(JNIEnv * env, jobject obj, jstring dir)
{
        const char* temp = env->GetStringUTFChars(dir, NULL);
    std::string stringDir(temp);

        // Will be receive as a std::string inside C++ code 
    MyNativeObjectInC++->SetupArchiveDir(stringDir);
}

Изменить:

Возможно, вам понадобится вручную создать/файлы на C, прежде чем использовать его в первый раз:

int result_code = mkdir("/data/data/com.app/files/", 0770)

Приветствия!

Ответ 2

У вас есть доступ к двум местоположениям из вашего приложения, SDCard и специальному каталогу данных для вашего приложения. Любое другое место отключено, если у вас нет доступа root.

Ответ 3

Необходимо создать файл перед использованием функции fopen(filePath, "a+"). Или используйте fopen(filePath, "a")