Android棒棒糖从本机代码c ++写入sdcard

时间:2015-07-04 11:00:03

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

我有android应用程序,它使用了很多c ++本机代码。应用程序需要使用位于SD卡上的文件(读取,创建,追加)。但Kitkat +拒绝为第三方应用程序写入SD卡。 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端关闭它。或两者兼而有之。
  3. 谢谢

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

2 个答案:

答案 0 :(得分:0)

尝试以下链接:

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

Android NDK写文件: Android NDK Write File

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

答案 1 :(得分:0)

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

  1. 打开ParcelFileDescriptor
  2. getFd()。
  3. 将Fd传递给本机代码。
  4. 关闭ParcelFileDescriptor。 (这是关闭你的java引用)
  5. Fd只是表示文件的linux id的int。在本地:

    1. Fdopen
    2. 做事
    3. Fclose(注意这是关闭你的原生文件指针)
    4. 两个关闭正在做不同的事情。

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