我正在开发一个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;
}
1条答案
按热度按时间4jb9z9bj1#
虽然
Uri
不一定是文件,但在某些情况下我们可以确定它是。例如,考虑在MediaStore上查询的文件。在这种情况下,您可以使用ContentResolver中的方法,如openFileDescriptor
,openAssetFileDescriptor
,openTypedAssetFileDescriptor
。这些返回对象,如AssetFileDescriptor
或ParcelFileDescriptor
。从返回的对象中,您可以获取已打开文件的文件描述符,并在NDK级别上传递它。例如,在ParcelFileDescriptor
上,您可以使用getFd()
或detachFd()
,这取决于您是否希望给予所有权。这适用于Android 10上的范围内存储。