Android lollipop пишет в SDCard из нативного кода C++

У меня есть приложение для Android, которое использует много родного кода на C++. Приложение должно работать с файлами, расположенными на SDCard (чтение, создание, добавление). Но Kitkat + запретил запись в SDCard для сторонних приложений. Android 5 представил новый API, который позволяет это снова.

Как использовать новый API доступа к SD-карте, представленный для Android 5.0 (Lollipop)?

Все примеры и документация, которые я нашел, в основном для Java. Примеры для нативного кода не существуют или очень неясны. Поэтому я хочу задать несколько вопросов.

Ссылка выше содержит ценный пример того, как получить DocumentFile, который может вернуть ParcelFileDescriptor. Из этого объекта я могу получить родной файловый дескриптор - ParcelFileDescriptor.getFd(). Это целое число, которое я посылаю в код C++ через jni.

В C++ я открываю файл с помощью fdopen(fd).

Мои вопросы:

  1. Является ли функция fdopen правильным способом, как открыть файл с новым API? Или DocumentFile уже открывает файл, и я должен использовать fd только в дальнейших операциях.
  2. Достаточно закрыть дескриптор файла внутри нативного кода с помощью fclose? или я должен закрыть его на стороне Java с ParcelFileDescriptor.detachFd(). Или оба.

Спасибо

РЕДАКТИРОВАТЬ: я получаю FD и detachFD работает. Но я так и не нашел ответ, как правильно заменить ftruncate, который тоже нуждается в записи, и я не нашел версию ftruncate, которая принимает файловый дескриптор как ввод

2 ответа

1) да, используйте файловые дескрипторы и fdopen 2)

  1. Открой ParcelFileDescriptor,
  2. getFd().
  3. Передайте Fd в нативный код.
  4. Закрой ParcelFileDescriptor, (это закрывает вашу ссылку на Java)

Fd просто int представляющий идентификатор linux для файла. На родном:

  1. Fdopen
  2. Делать вещи
  3. Fclose (обратите внимание, это закрывает ваш собственный указатель файла)

Два закрытия делают разные вещи.

Примечание: вам все еще нужно разрешение SAF для файла или более высокого уровня root.

Попробуйте ниже ссылки:

Android - запись / сохранение файлов только из собственного кода: Android - запись / сохранение файлов только из собственного кода

Android NDK Запись файла: Android NDK Запись файла

Файловые операции в Android NDK: Файловые операции в Android NDK

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