美文网首页Android-NDK/JNI
[Android]JNI进阶1-读取本地文件夹

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

作者: CangWang | 来源:发表于2018-12-03 19:45 被阅读4次

    大家好,我系苍王。

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

    [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<size_t>(len));
                    AAsset_close(asset);
                    AAssetDir_close(dir);
                    return buf;
                }
            }
        }
        AAssetDir_close(dir);
        return NULL;
    

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/aqfycqtx.html