NDK10_文件的拆分与合并

NDK开发汇总

一 动态注册native方法

#include <android/log.h>
#define TAG "Tim_JNI"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__)
# define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0])))

//获取文件大小
long  get_file_size(const char* path) {
    FILE *fp = fopen(path, "rb"); //打开一个文件, 文件必须存在,只运行读
    fseek(fp, 0, SEEK_END);
    long ret = ftell(fp);
    fclose(fp);
    return ret;
}

static const JNINativeMethod gMethods[] = {
        {
                "diff","(Ljava/lang/String;Ljava/lang/String;I)V",(void*)native_diff
        },
        {
                "patch","(Ljava/lang/String;Ljava/lang/String;I)V",(void*)native_patch
        }
};

//注册FileUtils 里面native方法
static int registerNatives(JNIEnv* engv)
{
    LOGI("registerNatives begin");
    jclass  clazz;
    clazz = (*engv) -> FindClass(engv, "com/dn/tim/dn_lsn_9/FileUtils");

    if (clazz == NULL) {
        LOGI("clazz is null");
        return JNI_FALSE;
    }

    if ((*engv) ->RegisterNatives(engv, clazz, gMethods, NELEM(gMethods)) < 0) {
        LOGI("RegisterNatives error");
        return JNI_FALSE;
    }

    return JNI_TRUE;
}


JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved)
{

    LOGI("jni_OnLoad begin");

    JNIEnv* env = NULL;
    jint result = -1;

    if ((*vm)->GetEnv(vm,(void**) &env, JNI_VERSION_1_4) != JNI_OK) {
        LOGI("ERROR: GetEnv failed\n");
        return -1;
    }
    assert(env != NULL);

     registerNatives(env);
    return JNI_VERSION_1_4;
}

二 文件拆分

JNIEXPORT void JNICALL native_diff
        (JNIEnv *env, jclass clazz, jstring path, jstring pattern_Path, jint file_num)
{
    LOGI("JNI native diff begin");

    const char *path_Str = (*env) -> GetStringUTFChars(env, path, NULL);
    const char *pattern_Path_str = (*env) ->GetStringUTFChars(env, pattern_Path, NULL);

    //申请二维字符数据, 存放子文件名
    char **patches = (char **)malloc(sizeof(char *) * file_num);

    int i =0;
    for (; i < file_num; i++) {
        //每个文件名申请地址
        LOGI("char = %d char * = %d", sizeof(char), sizeof(char *));
        patches[i] = (char*) malloc(sizeof(char) * 100);
        // 需要分割的文件 Vibrato.mp4
        // 每个子文件名称 Vibrato_n.mp4
        sprintf(patches[i], pattern_Path_str, i);// 格式化文件名
        LOGI("patch path : %s",patches[i]);
    }

    int fileSize =  get_file_size(path_Str);
    FILE *fpr = fopen(path_Str, "rb");
    /*
     * 1.判断文件大小能够被 file_num整除
     * 2.能整除就平分
     * 3.不能整除就先分 file_num -1
     * */

    if (fileSize % file_num == 0) {

        int part = fileSize / file_num;
        for (int i =0; i< file_num; i++) {
            FILE *fpw = fopen(patches[i], "wb");//文件已经存在 就删除,只运行写
            for (int j =0; j < part; j++) {
                fputc(fgetc(fpr), fpw);
            }
            fclose(fpw);
        }

    } else {
        int part = fileSize / (file_num - 1);
        for (int i =0 ; i< file_num - 1; i++) {
            FILE *fpw = fopen(patches[i], "wb");//文件已经存在 就删除,只运行写
            for (int j =0; j < part; j++) {
                fputc(fgetc(fpr), fpw);
            }
            fclose(fpw);
        }

        FILE *fpw = fopen(patches[file_num - 1], "wb");

        for (int i = 0; i < fileSize % (file_num - 1); i++) {
            fputc(fgetc(fpr),fpw);
        }
        fclose(fpw);
    }

    fclose(fpr);

    for (int i =0; i< file_num; i++) {
        free(patches[i]);
    }
    free(patches);
    (*env)->ReleaseStringUTFChars(env, path, path_Str);
    (*env)->ReleaseStringUTFChars(env, pattern_Path, pattern_Path_str);
}

三 文件合并

JNIEXPORT void JNICALL native_patch
        (JNIEnv *env, jclass clazz, jstring merge_path, jstring pattern_Path, jint file_num)
{
    LOGI("JNI native patch begin");
    const char *path_Str = (*env) -> GetStringUTFChars(env, merge_path, NULL);
    const char *pattern_Path_str = (*env) ->GetStringUTFChars(env, pattern_Path, NULL);

    //申请二维字符数据, 存放子文件名
    char **patches = (char **)malloc(sizeof(char *) * file_num);

    int i =0;
    for (; i < file_num; i++) {
        //每个文件名申请地址
//        LOGI("char = %d char * = %d", sizeof(char), sizeof(char *));
        patches[i] = (char*) malloc(sizeof(char) * 100);
        // 需要分割的文件 Vibrato.mp4
        // 每个子文件名称 Vibrato_n.mp4
        sprintf(patches[i], pattern_Path_str, i);// 格式化文件名
        LOGI("patch path : %s",patches[i]);
    }

    FILE *fpw = fopen(path_Str, "wb");

    for (int i =0; i < file_num; i++) {
        int filesize = get_file_size(patches[i]);
        FILE *fpr = fopen(patches[i], "rb");
        for (int j =0; j < filesize; j++) {
            fputc(fgetc(fpr), fpw);
        }
        fclose(fpr);
    }
    fclose(fpw);

    for (int i =0; i< file_num; i++) {
        free(patches[i]); //每一个malloc 对应一个free
    }
    free(patches);
    (*env)->ReleaseStringUTFChars(env, merge_path, path_Str);
    (*env)->ReleaseStringUTFChars(env, pattern_Path, pattern_Path_str);
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值