android - 如何使用 AssetFileDescriptor 的偏移量、长度和文件路径从 NDK 读取文件?
问题描述
我知道可以从 AssetFileDescriptor 内容(如偏移量和长度)中读取文件。我通过以下方式传递给 JNI 数据:
val resources = context.get()!!.resources
val file = resources.openRawResourceFd(rawFileId) // example: R.raw.you_file
val fileOffset = file.startOffset.toInt()
val fileLength = file.length.toInt()
try {
file.parcelFileDescriptor.close()
} catch (e: IOException) {
Log.e("error", "Couldn't close")
}
try {
this.id = ndkJNIBind(
context.get()!!.packageResourcePath, fileLength, fileOffset)
} catch (e: UnsatisfiedLinkError) {
Log.e("error", "Couldn't do ndkJNIBind")
}
现在,在 NDK 端我如何读取文件?
extern "C" JNICALL JNIEXPORT
void Java_package_TheClass_ndkJNIBind(
JNIEnv* env,
jobject __unused,
jstring path,
jint fileLength,
jint fileOffset
) {
// TODO: ??????
}
解决方案
https://developer.android.com/ndk/reference/group/asset
用于AAsset_seek
将文件指针重新定位到偏移量,并AAsset_read
读取字节。由于您的活动看起来像是 Java 活动,因此请使用它AAssetManager_fromJava
来获取 Asset Manager 对象。
另一个样本在这里。
推荐阅读
- python - Python:比较两个大文件
- ios - 在 Apple Pay 中为某些卡提供折扣
- ios - 对“结果”的访问重叠,但修改需要独占访问;考虑复制到 xcode 10 中的局部变量
- c++ - 用括号和等号创建对象有什么区别
- angular - 通过 https 连接并下载文件 ionic3
- django - 如何通过外键获取manytomanyfiled的查询集(模型只有2个字段)
- python - 在 python 上使用 remove() 时无法删除列表中的所有元素
- entity-framework - 实体框架迁移添加失败
- r - 如何将连续协变量合并到 R 中 ERGM 包中的 nodematch() 函数中?
- python-3.x - Python中2个具有类型提示的类的相互依赖关系