Записать файл в папку, отличную от SDcard, используя Android NDK? - PullRequest
14 голосов
/ 19 января 2011

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

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

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

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

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

Ответы [ 2 ]

18 голосов
/ 18 мая 2011
  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);
}

Редактировать:

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

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

Cheers!

5 голосов
/ 19 января 2011

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

...