我有一个使用大量 C++ native 代码的 Android 应用程序。应用程序需要处理位于 sdcard 上的文件(读取、创建、追加)。但是 Kitkat+ 拒绝为 3rd 方应用程序写入 sdcard。 Android 5 引入了新的 API,再次允许这样做。
How to use the new SD card access API presented for Android 5.0 (Lollipop)?
我找到的所有示例和文档主要针对 Java 方面。 native 代码示例不存在或非常不清楚。所以我想问几个问题。
上面的链接包含如何获取可以返回 ParcelFileDescriptor 的 DocumentFile 的有值(value)的示例。从这个对象我能够接收 native 文件描述符 - ParcelFileDescriptor.getFd()。这是我通过 jni 发送到 C++ 代码的整数。
在 C++ 中,我使用 fdopen(fd) 打开文件。
我的问题是:
- fdopen 函数是如何用新的 api 打开文件的正确方法吗?或者 DocumentFile 已经打开文件,我应该只在进一步的操作中使用 fd。
- 用 fclose 关闭 native 代码中的文件描述符就足够了吗?或者我应该在 Java 端使用 ParcelFileDescriptor.detachFd() 关闭它。或两者兼而有之。
谢谢
编辑:我 getFD 和 detachFD 工作。但是我从来没有找到如何正确替换 ftruncate 的答案,它也需要写访问权限,而且我没有找到将文件描述符作为输入的 ftruncate 版本
最佳答案
1) 是的,使用文件描述符和 fdopen 2)
- 打开
ParcelFileDescriptor
。 - getFd()。
- 将 Fd 传递给 native 代码。
- 关闭
ParcelFileDescriptor
。 (这将关闭您的 Java 引用)
Fd 只是一个 int
表示一个文件的 linux id。原生:
- 打开
- 做事
- Fclose(注意这是关闭你的本地文件指针)
这两个关闭在做不同的事情。
注意:您仍然需要该文件或更高根目录的 SAF 权限。
关于Android Lollipop 从 native 代码c++写入sdcard,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31219819/