android 如何在ndk中处理内容uri?

ryevplcw  于 2023-05-15  发布在  Android
关注(0)|答案(1)|浏览(206)

我正在开发一个android应用程序,需要发送一个文件到NDK并对该文件进行一些处理。问题是,在选择文件后,Android(由于权限)返回一个内容URI,而NDK需要该文件的真实的(绝对)路径。
现在,问题是“我如何处理NDK和Android java(或Kotlin)源代码之间的这个问题?“
有一些代码可以将内容uri转换为真实的的文件路径,但它们不起作用,并返回空字符串。另外,我知道如何在java(Kotlin)端处理内容URI。
在Kotlin中:

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
            }
        }
    }

在cpp中:

extern "C" JNIEXPORT jint JNICALL
Java_org_my_apps_cpptest_MainActivity_doProcess(
        JNIEnv *env,
        jobject /* this */,
        jstring file) {
    //content uri not working, needs a real path
    std::string rfn = env->GetStringUTFChars(file, nullptr);
    std::ifstream is(rfn, std::ios::in);
    if(is.is_open()){
        // processing ...
        is.close();
        return 0;
    }
    return -1;
}
4jb9z9bj

4jb9z9bj1#

虽然Uri不一定是文件,但在某些情况下我们可以确定它是。例如,考虑在MediaStore上查询的文件。在这种情况下,您可以使用ContentResolver中的方法,如openFileDescriptoropenAssetFileDescriptoropenTypedAssetFileDescriptor。这些返回对象,如AssetFileDescriptorParcelFileDescriptor。从返回的对象中,您可以获取已打开文件的文件描述符,并在NDK级别上传递它。例如,在ParcelFileDescriptor上,您可以使用getFd()detachFd(),这取决于您是否希望给予所有权。这适用于Android 10上的范围内存储。

相关问题