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

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

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

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

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

Solutions Collecting From Web of "Файл записи NDK для Android"

  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 на своем устройстве. Некоторые игры используют этот способ выполнения вещей, но я бы не рекомендовал его. Если вы все еще хотите это сделать, Superuser приложение 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.