我正在开发一个需要将文件发送到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;
}
答案 0 :(得分:0)
尽管Uri
不必是文件,但在某些情况下我们可以确定它是文件。例如,考虑在MediaStore上查询的文件。在这种情况下,您可以使用ContentResolver中的方法,例如openFileDescriptor
,openAssetFileDescriptor
,openTypedAssetFileDescriptor
。这些返回对象如AssetFileDescriptor
或ParcelFileDescriptor
。从返回的对象中,您可以获取打开文件的文件描述符,并将其传递到NDK级别。例如,在ParcelFileDescriptor
上您有getFd()
或detachFd()
,具体取决于是否要授予所有权。此功能适用于Android 10上的范围存储。