首页 > 解决方案 > 如何使用 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: ??????
}

标签: androidandroid-ndk

解决方案


https://developer.android.com/ndk/reference/group/asset

用于AAsset_seek将文件指针重新定位到偏移量,并AAsset_read读取字节。由于您的活动看起来像是 Java 活动,因此请使用它AAssetManager_fromJava来获取 Asset Manager 对象。

另一个样本在这里


推荐阅读