Записать файл в папку, отличную от SDcard, используя Android NDK?

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

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

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

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

Что позволяет писать как в файловой системе или как?

3 ответа

  1. Вы всегда можете получить доступ к каталогу, в котором находится ваше приложение.

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

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

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

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

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

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

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

  3. В противном случае вы можете получить root права на устройство и получить доступ ко всей файловой системе. Но перед использованием приложения вам нужно будет попросить всех пользователей вашего приложения получить 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)

Ура!

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

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

Другие вопросы по тегам