【发布时间】:2015-08-16 02:53:44
【问题描述】:
如何在原生 JNI 代码中访问从 Android KitKat/Lollipop 中的DocumentFile 生成的文件,以便我可以使用 fopen、fread 等。 我特别要求它通过 NDK 访问外部 SD 卡文件。
【问题讨论】:
标签: android android-ndk android-5.0-lollipop
如何在原生 JNI 代码中访问从 Android KitKat/Lollipop 中的DocumentFile 生成的文件,以便我可以使用 fopen、fread 等。 我特别要求它通过 NDK 访问外部 SD 卡文件。
【问题讨论】:
标签: android android-ndk android-5.0-lollipop
你可以使用文件描述符:
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 卡上的文件或目录的权限
【讨论】:
close,当 Java 端获得控制权时,它也会调用 close,因为 getFd() 不会转移所有权。 Java 代码可以调用 detachFd() 而不是在本机端调用 fclose 就可以了。唯一的问题是,如果错误路径阻止本机代码到达 fdopen,则仍需要释放 fd。另一种选择可能是在本机端执行fdopen(dup(fd), "r+b")(注意对dup 的调用),然后在文件指针上调用fclose。