如何处理 ndk 中的内容 uri?

reb*_*r86 6 android uri android-ndk

我正在开发一个 Android 应用程序,需要将文件发送到 NDK 并对该文件执行一些处理。问题是,在选择文件后,Android(由于权限)返回一个内容 Uri,而 NDK 需要一个真实的(绝对)该文件的路径。

现在的问题是“如何处理 NDK 和 Android java(或 kotlin)源代码之间的这个问题?”

有一些代码可以将内容 uri 转换为真实文件路径,但它们不起作用并返回空字符串。另外,我知道如何在 java(kotlin) 端处理内容 uri。

在科特林中:

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == REQUEST_WRITE_FILE_TXT && resultCode == Activity.RESULT_OK) {
            data?.let {
                doProcess(it.data.toString())  // data is Uri and this method is native method
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

在.cpp中:

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == REQUEST_WRITE_FILE_TXT && resultCode == Activity.RESULT_OK) {
            data?.let {
                doProcess(it.data.toString())  // data is Uri and this method is native method
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

And*_*oom 1

尽管 aUri不一定是文件,但在某些情况下我们可以确定它是文件。例如,考虑在 MediaStore 上查询的文件。在这种情况下,您可以使用 ContentResolver 中的方法,例如openFileDescriptoropenAssetFileDescriptoropenTypedAssetFileDescriptor。那些返回对象如AssetFileDescriptoror ParcelFileDescriptor。从返回的对象中,您可以获取打开文件的文件描述符并将其传递到 NDK 级别。例如,取决于ParcelFileDescriptor您拥有getFd()detachFd()取决于您是否想授予所有权。这适用于 Android 10 上的分区存储。