相关疑难解决方法(0)

文件描述符和文件指针之间有什么区别?

我想知道文件描述符和文件指针之间的区别.

此外,在什么情况下你会使用一个而不是另一个?

c file-descriptor file-pointer

106
推荐指数
5
解决办法
8万
查看次数

Android - 使用 Google Scoped Storage API 访问本机 C/C++ 代码中的文件

我需要在原生 C/C++ 代码中的 Android 应用程序中按文件名打开文件。本机代码是我不想修改的第 3 方库,但它们通常需要文件名作为读/写文件的参数。使用 Google 的“范围存储”API 并在 Android 10 或更高版本中禁用对文件的本机访问,这是一个真正的问题。

一个众所周知的解决方案是获取文件描述符并使用“proc/self/fd/FD_NUMER”技巧,例如:

       ParcelFileDescriptor mParcelFileDescriptor = null;

       String getFileNameThatICanUseInNativeCode(Context context, DocumentFile doc) { 
           try {
                Uri uri = doc.getUri();
                mParcelFileDescriptor =
                        context.getContentResolver().openFileDescriptor(uri, "r");
                if (mParcelFileDescriptor != null) {
                    int fd = mParcelFileDescriptor.getFd();
                    return "/proc/self/fd/" + fd;
                }
            }
            catch (FileNotFoundException fne) {
                return "";
            }
        }

        // Don't forget to close mParcelFileDescriptor when done!
Run Code Online (Sandbox Code Playgroud)

将此传递给本机 C/C++ 代码有效,但前提是文件位于手机主存储中。如果用户尝试打开插入手机插槽的外部 SD 卡上的文件,则不起作用 - 以这种方式打开的文件没有读取权限。我只能获取文件描述符 int 号并使用 fdopen(fd)。但这将需要修改 3rd 方库(开源或许可)的源代码,并且每次更新这些库的原始源时都会令人头疼。

有没有更好的解决这个问题的方法?不,我不想听到添加的解决方案 …

java-native-interface android scoped-storage

8
推荐指数
2
解决办法
2858
查看次数