【问题标题】:How to access Android Lollipop DocumentFile files via NDK?如何通过 NDK 访问 Android Lollipop DocumentFile 文件?
【发布时间】:2015-08-16 02:53:44
【问题描述】:

如何在原生 JNI 代码中访问从 Android KitKat/Lollipop 中的DocumentFile 生成的文件,以便我可以使用 fopen、fread 等。 我特别要求它通过 NDK 访问外部 SD 卡文件。

【问题讨论】:

标签: android android-ndk android-5.0-lollipop


【解决方案1】:

你可以使用文件描述符:

ParcelFileDescriptor filePfd;
DocumentFile file;
filePfd = getContentResolver().openFileDescriptor(file.getUri(), "w");
int fd = filePfd.getFd();

这个 int fd 可以传递给 JNI 并像往常一样使用 C++ 文件描述符:

FILE* file = NULL;
file = fdopen(fd, "r+b");

并且您需要访问 SD 卡上的文件或目录的权限

【讨论】:

  • 你需要为 fdopen 做一个 fclose 吗?还是在关闭文件描述符时会产生问题?
  • @PerracoLabs 文件指针和文件描述符是不同的实体。所以,我认为,你需要做 fclose()。但找出答案的最好方法是测试它。您也可以查看:stackoverflow.com/questions/2423628/…
  • @PerracoLabs 调用 fclose 是个坏主意,因为它会隐含 close,当 Java 端获得控制权时,它也会调用 close,因为 getFd() 不会转移所有权。 Java 代码可以调用 detachFd() 而不是在本机端调用 fclose 就可以了。唯一的问题是,如果错误路径阻止本机代码到达 fdopen,则仍需要释放 fd。另一种选择可能是在本机端执行fdopen(dup(fd), "r+b")(注意对dup 的调用),然后在文件指针上调用fclose
猜你喜欢
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多