簡體   English   中英

如何處理 ndk 中的內容 uri?

[英]How can I deal with content uri in ndk?

我正在開發一個需要將文件發送到 NDK 並對該文件進行一些處理的 android 應用程序。這個文件的路徑。

現在,問題是“我該如何處理 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;
}

盡管Uri不需要是文件,但在某些情況下我們可以確定它是。 以在 MediaStore 上查詢的文件為例。 在這種情況下,你可以使用的方法從ContentResolver的像openFileDescriptoropenAssetFileDescriptoropenTypedAssetFileDescriptor 那些返回對象,如AssetFileDescriptorParcelFileDescriptor 從返回的對象中,您可以獲取打開文件的文件描述符並將其傳遞到 NDK 級別。 例如,在ParcelFileDescriptor您有getFd()detachFd()取決於您是否想要授予所有權。 這適用於 Android 10 上的 Scoped Storage。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM