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

У меня есть приложение для 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, которая принимает файловый дескриптор как ввод

3

Решение

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

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

Android NDK Написать файл:
Android NDK Написать файл

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

0

Другие решения

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

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

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

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

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

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

0

По вопросам рекламы [email protected]