Записать файл в папку, отличную от SDcard, используя Android NDK?
Есть ли другой способ записать файл куда-нибудь еще, кроме SD-карты?
Я пробовал много разных путей в файловой системе, но fopen всегда возвращает NULL, за исключением любого файла, который я пишу / читаю в /sdcard/...
Есть ли что-то еще эквивалентное:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Что позволяет писать как в файловой системе или как?
3 ответа
Вы всегда можете получить доступ к каталогу, в котором находится ваше приложение.
Этот каталог обычно:
data/data/<Your_package_name_usually com.android.appName>/files/<your_filename>
но лучше использовать
getFilesDir()
чтобы обеспечить действительный путь к файлу с будущими изменениями версии Android.Если вы хотите использовать внешнее хранилище, убедитесь, что вы поместили эту строку кода в манифест приложения, чтобы получить разрешение.
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Затем используйте каталог sdcard:
getExternalStorageDirectory(); //usually : /sdcard/<your_filename>
В противном случае вы можете получить 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")