[英]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的像openFileDescriptor
, openAssetFileDescriptor
, openTypedAssetFileDescriptor
。 那些返回對象,如AssetFileDescriptor
或ParcelFileDescriptor
。 從返回的對象中,您可以獲取打開文件的文件描述符並將其傳遞到 NDK 級別。 例如,在ParcelFileDescriptor
您有getFd()
或detachFd()
取決於您是否想要授予所有權。 這適用於 Android 10 上的 Scoped Storage。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.