如何删除从 Java 代码传递的本机代码中的文件?

How to delete file in native code passed from Java code?

我正在将我的 Android 应用程序(Java + 原生)的代码调整为 Android 10 个分区存储更改。

我在清单中声明了所需的权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

我启动了 ACTION_OPEN_DOCUMENT_TREE 让用户选择一个目录。

我所做的是在外部存储上创建文件,分离文件描述符并传递给本机代码:

DocumentFile df = documentFile.createFile("text/plain", "my_file");
ParcelFileDescriptor pfd = getApplicationContext().getContentResolver().openFileDescriptor(df.getUri(), "rw");
myNativeFunction(pfd.detachFd());

现在,本机端reads/writes from/to 文件。并负责关闭文件描述符。

我的问题是如何通过本机代码删除该文件?

通常,为了删除文件,需要将路径名传递给它(remove()、unlink() 函数将其作为参数)。使用 Uri 我没能做到这一点 - 我收到 "No such file or directory" 错误。

谢谢。

感谢 CommonsWare 我意识到我需要重新考虑我的应用程序设计。 因此,对于这种情况,我决定使用 read()/write() 保留在 Java 端(包括删除)和 read/write from/to 文件上运行的所有代码本机端的 C 函数(使用先前从 Java 分离的文件描述符)。就我而言,它实际上是这样的:

  1. Android 应用程序:

    • 启动 ACTION_OPEN_DOCUMENT_TREE 以选择文档树并将相应的树 Uri 传递到我的 Android AAR 库
    • 请求 AAR 库删除树 Uri 下的文件
  2. AAR 库(Java + 原生):

    • 从传递的树 Uri 创建 DocumentFile 对象
    • 在文档树下创建文档文件并将文件描述符传递给本机代码(应用程序不必知道任何关于实际文件的信息)
    • 删除文档文件