gpt4 book ai didi

Android Lollipop 从 native 代码c++写入sdcard

转载 作者:太空狗 更新时间:2023-10-29 15:26:19 26 4
gpt4 key购买 nike

我有一个使用大量 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) 打开文件。

我的问题是:

  1. fdopen 函数是如何用新的 api 打开文件的正确方法吗?或者 DocumentFile 已经打开文件,我应该只在进一步的操作中使用 fd。
  2. 用 fclose 关闭 native 代码中的文件描述符就足够了吗?或者我应该在 Java 端使用 ParcelFileDescriptor.detachFd() 关闭它。或两者兼而有之。

谢谢

编辑:我 getFD 和 detachFD 工作。但是我从来没有找到如何正确替换 ftruncate 的答案,它也需要写访问权限,而且我没有找到将文件描述符作为输入的 ftruncate 版本

最佳答案

1) 是的,使用文件描述符和 fdopen2)

  1. 打开 ParcelFileDescriptor
  2. getFd()。
  3. 将 Fd 传递给 native 代码。
  4. 关闭 ParcelFileDescriptor。 (这将关闭您的 Java 引用)

Fd 只是一个 int 表示一个文件的 linux id。原生:

  1. 打开
  2. 做事
  3. Fclose(注意这是关闭你的本地文件指针)

这两个关闭在做不同的事情。

注意:您仍然需要该文件或更高根目录的 SAF 权限。

关于Android Lollipop 从 native 代码c++写入sdcard,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31219819/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com