大家好,我系苍王。
以下是我这个系列的相关文章,有兴趣可以参考一下,可以给个喜欢或者关注我的文章。
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;