android 读写文件 简书,[Android]JNI进阶1-读取本地文件夹

大家好,我系苍王。

以下是我这个系列的相关文章,有兴趣可以参考一下,可以给个喜欢或者关注我的文章。

127490a3bdd2

image.png

这一节就介绍一个简单的运用,就是如何利用jni读取App文件。

需要思考的问题是,我们如何获取到App内的地址?

1.外部传入地址,那么就能通过File 的io操作来完成文件读写了,这个就是正常的文件操作了

2.通过读取assets里面的内置资源文件,这样就不需要传递地址到jni内了,只需要传递文件名就可以完成。

下列暂时一下,怎么读取一个文本文件的内容

std::string *readShaderFromAsset(AAssetManager *manager, const char *fileName){

//打开asset文件夹

AAssetDir *dir = AAssetManager_openDir(manager,"");

//文件名

const char *file = nullptr;

//文件内容

std::string *result = new std::string;

while ((file =AAssetDir_getNextFileName(dir))!= nullptr){

//对比文件名字

if (strcmp(file,fileName) == 0){

//打开asset文件节点

AAsset *asset = AAssetManager_open(manager,file,AASSET_MODE_STREAMING);

char buf[1024];

int nb_read = 0;

//读取文件内容

while ((nb_read =AAsset_read(asset,buf, 1024))>0){

result->append(buf,(unsigned long)nb_read);

}

//关闭asset文件

AAsset_close(asset);

break;

}

}

//关闭asset文件夹

AAssetDir_close(dir);

return result;

}

如何打开assets文件的再里面的一个文件夹assets/filter

//打开asset文件夹中的filter文件夹

AAssetDir *dir = AAssetManager_openDir(manager,"filter");

const char *file = nullptr;

while ((file =AAssetDir_getNextFileName(dir))!= nullptr) {

if (strcmp(file, fileName) == 0) {

//文件地址 为/filter文件夹的内容

std::string *name = new std::string("filter/");

name->append(file);

AAsset *asset = AAssetManager_open(manager, name->c_str(), AASSET_MODE_STREAMING);

if (asset != NULL) {

//获取文件长度

int len = AAsset_getLength(asset);

*length = len;

unsigned char *buf = (unsigned char *) malloc(sizeof(unsigned char) * len);

AAsset_read(asset, buf, static_cast(len));

AAsset_close(asset);

AAssetDir_close(dir);

return buf;

}

}

}

AAssetDir_close(dir);

return NULL;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值