3

我有使用大量 c++ 本机代码的 android 应用程序。应用程序需要处理位于 sdcard 上的文件(读取、创建、附加)。但是 Kitkat+ 拒绝为 3rd 方应用程序写入 sdcard。Android 5 引入了新的 API,再次允许这样做。

如何使用为 Android 5.0 (Lollipop) 提供的新 SD 卡访问 API?

我发现的所有示例和文档主要用于 Java 方面。本机代码的示例不存在或非常不清楚。所以我想问几个问题。

上面的链接包含有价值的示例如何获取可以返回 ParcelFileDescriptor 的 DocumentFile。从这个对象我能够接收本机文件描述符 - ParcelFileDescriptor.getFd()。这是我通过 jni 发送到 c++ 代码的整数。

在 c++ 中,我使用 fdopen(fd) 打开文件。

我的问题是:

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

谢谢

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

4

2 回答 2

0

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

  1. 打开ParcelFileDescriptor.
  2. 获取Fd()。
  3. 将 Fd 传递给本机代码。
  4. 关闭ParcelFileDescriptor. (这是关闭你的 java 参考)

Fd 只是一个int代表文件的 linux id。在本地:

  1. 开放式
  2. 做东西
  3. Fclose(注意这是关闭您的本机文件指针)

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

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

于 2016-02-04T16:51:04.153 回答
-1

试试下面的链接:

Android - 仅从本机代码 写入/保存文件:Android - 仅从本机代码写入/保存文件

Android NDK 写入文件: Android NDK 写入文件

Android NDK 中的 文件操作:Android NDK 中的文件操作

于 2015-07-09T07:07:16.937 回答