【问题标题】:Android lollipop write to sdcard from native code c++Android棒棒糖从本机代码c ++写入sdcard
【发布时间】:2015-09-22 01:31:25
【问题描述】:

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

How to use the new SD card access API presented for Android 5.0 (Lollipop)?

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

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

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

我的问题是:

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

谢谢

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    1. Fdopen
    2. 做事
    3. Fclose(注意这是关闭你的原生文件指针)

    两个关闭做不同的事情。

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

    【讨论】:

    • 如何解决 ftruncate 的相同问题?没有接受文件描述符的 ftruncate 版本
    • 唯一的方法是将缓存用作交换空间并使用 SAF 传输。我最初不得不使用 MTP 方法来做到这一点,因为它们也没有 FD。提交一个错误报告,他们会在三年内修复它,他们为 MTP 做了。 SAF 是我见过的构思和执行最糟糕的框架之一。他们破坏了一半的代码,而且多年来根本不在乎。
    • 一夜之间,我使用 fseek 编写了自己的 ftruncate 版本,并将数据从一个文件复制到另一个文件。但是......我的应用程序是需要性能的模拟器,并且模拟的 ftruncate 很慢。当我在谈论它时,跳转到java文件描述符也很慢。
    【解决方案2】:

    试试下面的链接:

    Android - 仅从本机代码写入/保存文件: Android - writing/saving files from native code only

    Android NDK 写入文件: Android NDK Write File

    Android NDK 中的文件操作: File Operations in Android NDK

    【讨论】:

    • 您好,谢谢。这些链接非常有用。但不幸的是,如果文件系统受到 SAF developer.android.com/guide/topics/providers/… 的保护,则不是实际的
    • 目前我使用 ParcelFileDescriptor.detachFd() 并将其发送到本机代码。然后使用 fclose() 函数关闭文件。但是我收到了这个警告:W/ParcelFileDescriptor:关闭时对等预期信号;分离后无法交付....
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    • 2015-06-21
    相关资源
    最近更新 更多