ndk之AAssetManager

本文介绍如何使用Android的AAssetManager进行文件操作,包括打开、读取、关闭文件及获取文件长度等方法,并提供了示例代码。同时记录了作者在使用过程中遇到的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用于操作asset,其中包含了各种对asset文件的操作方法

//需要引入的头文件
#include <android/asset_manager_jni.h>

基本步骤

AAssetManager* AAssetManager_fromJava(JNIEnv* env, jobject assetManager);
//open eg:
AAsset* AAssetManager_open(AAssetManager* mgr, const char* filename, int mode);
//operate eg:
int AAsset_read(AAsset* asset, void* buf, size_t count);
//close eg:
void AAsset_close(AAsset* asset);

简单使用,有2处不明白的地方。
1.利用文件描述符读取内容始终不对
2.api中采用64位长度获取大小的值很奇怪,没看懂
有知道的兄弟麻烦告诉我下

 AAssetManager *aAssetManager=AAssetManager_fromJava(env,assetManager);
    AAsset *aAsset=AAssetManager_open(aAssetManager,"asset_test.txt",AASSET_MODE_UNKNOWN);
    //实际测试发现返回的数据末尾没有\0,如果需要打印信息自己补
    //获取文件的全部内容
    char *buff=(char*)AAsset_getBuffer(aAsset);
    off_t len=AAsset_getLength(aAsset);
    LOGI("%s",buff);
    LOGI("%d",len);
    char *actual_buff=malloc(sizeof(char)*len+1);
    actual_buff[len]='\0';
    memcpy(actual_buff,buff,len);
    LOGI("%s",actual_buff);

    //读取
    char *read_buff=malloc(sizeof(char)*5+1);
    read_buff[5]='\0';
    AAsset_read(aAsset,read_buff,5);
    LOGI("%s",read_buff);
    //剩余数据长度
    off_t remain=AAsset_getRemainingLength(aAsset);
    LOGI("%d",remain);

    //seek
    AAsset_seek(aAsset,0,SEEK_SET);
    remain=AAsset_getRemainingLength(aAsset);
    LOGI("%d",remain);

    //这一部分读的内容始终不对,不知道为什么
//    //file descriptor
//    off_t start,lens;
//    int fd=AAsset_openFileDescriptor(aAsset,&start,&lens);
//    FILE *fp=fdopen(fd,"r");
//    char *d_buff=malloc(sizeof(char)*lens+1);
//    memset(d_buff,0,lens+1);
//    fread(d_buff,1,lens+1,fp);
//    fclose(fp);
//    LOGI("%s",d_buff);
//    free(d_buff);


//    这个64返回的值很奇怪不知道为什么
//    off64_t len64=AAsset_getLength64(aAsset);
//    LOGI("%d",len64);
    AAsset_close(aAsset);

    //遍历文件
    AAssetDir *aAssetDir=AAssetManager_openDir(aAssetManager,"test");
    char *file_list;
    do{
        file_list=AAssetDir_getNextFileName(aAssetDir);
        if(file_list)
            LOGI("%s",file_list);
    }while (file_list);

源码地址

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值