jni 提取 assets 目录下的文件

传入参数 :
ctx = context
dir = 文件路径
szDexPath = ......jiami.dat
fileName = jiami.dat

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <android/asset_manager.h>
#include <android/asset_manager_jni.h>

int extract_file(JNIEnv* env, jobject ctx, const char* dir,const char* szDexPath,const char* fileName)
{

    if (access(dir, F_OK) !=0) {        // 判断 这两个路径、文件是否存在
        mkdir(dir, 505);
        chmod(dir, 505);
    }

    if (access(szDexPath,F_OK)==0) {
      LOGD("[+]File %s have existed",szDexPath);
        return 0;
    }
    //jiami.dat不存在,开始提取
    else {
        AAssetManager* mgr;
        jclass ApplicationClass = env->GetObjectClass(ctx);
        jmethodID getAssets = env->GetMethodID(ApplicationClass, "getAssets", "()Landroid/content/res/AssetManager;");
        jobject Assets_obj = env->CallObjectMethod(ctx, getAssets);
        mgr = AAssetManager_fromJava(env, Assets_obj);      // 获取 AssetManager 对象
        if (mgr == NULL) {
            LOGE("[-]getAAssetManager failed");
            return 0;
        }
        AAsset* asset = AAssetManager_open(mgr, fileName, AASSET_MODE_STREAMING);   // 获取 asset 对象,对应的文件名    UNKNOWN 0, RANDOM 1, STREAMING 2, BUFFER 3
        FILE* file = fopen(szDexPath, "wb");        // wb 只写打开或新建一个二进制文件;只允许写数据
        int bufferSize = AAsset_getLength(asset);       // 长度
        LOGD("[+]Asset FileName:%s,extract path:%s,size:%d\n",fileName,szDexPath, bufferSize);      // Asset FileName:jiami.dat, extract path:/data/data/com.wangwz.ndk_test/files/.jiagu/jiami.dat, size:2639568
        void* buffer =malloc(4096);
        while (true) {
            int numBytesRead = AAsset_read(asset, buffer, 4096);
            if (numBytesRead <= 0)
                break;
            fwrite(buffer, numBytesRead, 1, file);      // 写入到 file 内
        }
        free(buffer);
        fclose(file);
        AAsset_close(asset);
        chmod(szDexPath, 493);
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 137,246评论 19赞 139
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 13,709评论 2赞 33
  • 一、基本用法 1.1 架设 HTTP 服务 // demos/01.jsconst Koa = require('...
    majun00阅读 1,581评论 0赞 5
  • 第一步:先科普一下基础知识: Core Graphics是基于C的API,可以用于一切绘图操作 Core Grap...
    真爱要有你才完美阅读 2,533评论 0赞 1
  • 小路的九曲回肠 消化不了隐居的村庄 老黄牛将你思量 清泉滴滴蒸腾着姑娘的忧伤 啊 你喂你的鸡 我放我的羊 你总爱坐...
    饶晗阅读 154评论 0赞 4

友情链接更多精彩内容