[Android]JNI进阶1-读取本地文件夹

大家好,我系苍王。

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

[Android]如何做一个崩溃率少于千分之三噶应用app--章节列表

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;

你可能感兴趣的:([Android]JNI进阶1-读取本地文件夹)