如何处理ndk中的内容uri?

时间:2019-07-07 16:35:42

标签: android android-ndk uri

我正在开发一个需要将文件发送到NDK并对该文件进行一些处理的android应用程序。问题是,选择文件后,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
            }
        }
    }

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

1 个答案:

答案 0 :(得分:0)

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