You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android JNI C++读取Asset文件失败 fopen返回NULL问题咨询

问题成因
  • Android的assets目录下的所有资源会被直接打包进APK压缩包,应用安装时不会把这些资源解压到本地文件系统的普通路径下。你通过AAssetDir_getNextFileName拿到的model.tflite只是APK内部assets条目的名称,不是本地文件系统中存在的真实文件路径。
  • 你调用fopen(filename, "w")时只传了裸文件名model.tflite,libc会默认在进程当前工作目录下查找该文件,这个路径下根本不存在对应文件,因此fopen调用失败返回NULL,后续fwrite传入空指针直接触发了崩溃。
  • 核心认知偏差:AAssetManager是访问assets内容的专属API,assets内的资源不支持通过标准C/C++文件IO接口(fopen/fread等)直接用文件名访问,两套访问逻辑完全不互通。
正确实现参考

如果你的目标是在C++层加载TFLite模型,完全不需要做额外的文件拷贝,可以直接用两种合规方式实现:

  • 调用AAsset_read把模型内容读到内存缓冲区,直接把缓冲区地址传给TFLite的模型加载接口
  • 调用AAsset_openFileDescriptor获取assets资源对应的文件描述符,搭配返回的起始偏移、资源长度参数,直接传给TFLite支持从fd加载模型的接口,性能更高。
    如果你确实需要把assets内的文件拷贝到本地可写路径使用,必须先通过Kotlin/Java层拿到应用沙箱的真实可写目录(比如context.filesDir.absolutePath),把目录路径和文件名拼接成完整的合法文件路径(格式类似/data/data/你的应用包名/files/model.tflite),再把这个完整路径传给JNI层的fopen调用,不能直接使用assets返回的裸文件名。

内容的提问来源于stack exchange,提问作者YeongHwa Jin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 11:03:23