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

标签 android c++ android-5.0-lollipop sd-card fdopen

我有一个使用大量 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) 是的,使用文件描述符和 fdopen 2)

  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/

相关文章:

android - 带有 2.3.6 的 galaxy note 上的蓝牙 SPP

android - 微调器显示错误的值

android - 更改 Lollipop 操作栏的操作栏项目的按下颜色

android - 动态设置和删除 TRANSLUCENT 状态栏标志

Android View vs SurfaceView vs GLSurfaceView for 2D drawing app with Zoomable User Interface

android - Android中onViewRecycled、onDetachedFromRecyclerView、onViewDetachedFromWindow的区别

c++ - Lapackpp 与 Boost BLAS

c++ - 在 Eigen C++ : mix complex matrix and real matrix

c++ - SSBO 哈希表,缺失值

当背景为白色时,Android 5.0 使未选中的复选框不可见