NDK拆分合并文件
来源:互联网 发布:淘宝衣服缩水 编辑:程序博客网 时间:2024/05/21 06:12
分割文件合并 可以用于上传大文件的时候进行分割上传等等
java 源码:
package com.fmy.androidsplit;import java.io.File;import android.app.Activity;import android.os.Bundle;import android.os.Environment;import android.provider.Settings.System;import android.view.Menu;import android.view.MenuItem;public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //要分割的文件地址 File splitfile = new File(Environment.getExternalStorageDirectory(),"fmy.mp4"); File outfile = new File(Environment.getExternalStorageDirectory(),"fmy%d.mp4"); File outmergefile = new File(Environment.getExternalStorageDirectory(),"fmymerge.mp4"); //要 split_file(splitfile.getAbsolutePath(),3,outfile.getAbsolutePath()); merge_file(outfile.getAbsolutePath(),3,outmergefile.getAbsolutePath()); } static{ java.lang.System.loadLibrary("AndroidSplit"); } /** * 分割文件 * @param splitFilePath 要分割的路径 * @param outPath 输出分割路径 其中每个文件末尾用%d代替 如 D:XXX%d.jpg * @param number 分割数量 */ public native void split_file(String splitFilePath,int number,String outPath); /** * 合并被分割的文件 * @param splitFilePath 被分割的文件路径 且有占位符 %d 如 D:XXX%d.jpg * @param number 被分割的文件数目 * @param outPath 输出路径 */ public native void merge_file(String splitFilePath,int number,String outPath);}
c源码:
#include <jni.h>#include<com_fmy_androidsplit_MainActivity.h>#include<stdio.h>#include<android/log.h>#include<stdlib.h>#define LOGE(FORMAT,...) __android_log_print(ANDROID_LOG_ERROR,"FMY", FORMAT, __VA_ARGS__)long file_Size(char *path){ FILE *filep = fopen(path,"rb"); fseek(filep,0,SEEK_END); return ftell(filep);}JNIEXPORT void JNICALL Java_com_fmy_androidsplit_MainActivity_merge_1file(JNIEnv * env, jobject jojt, jstring splitFilePath, jint count, jstring outFilePath){ //占位符路径 如 d:xxx%d.jpg char * splitFilePathChar = (*env)->GetStringUTFChars(env,splitFilePath,NULL); //合并文件路徑 char * outFilePathChar = (*env)->GetStringUTFChars(env,outFilePath,NULL); int var; //打開輸出文件 FILE * outFilep = fopen(outFilePathChar,"wb"); for (var = 0; var < count; ++var) { //分割文件路徑名 char * splitFilePathEeatChar = calloc(200,sizeof(char)); //格式化路徑 sprintf(splitFilePathEeatChar,splitFilePathChar,var); //打開被分割的文件 FILE * filep = fopen(splitFilePathEeatChar,"rb"); int ch; while((ch=fgetc(filep))!=EOF){ fputc(ch,outFilep); } free(filep); fclose(filep); } //關閉輸出文件指向 fclose(outFilep); //释放指向 (*env)->ReleaseStringUTFChars(env,splitFilePath,splitFilePathChar); //释放指向 (*env)->ReleaseStringUTFChars(env,outFilePath,outFilePathChar);}JNIEXPORT void JNICALL Java_com_fmy_androidsplit_MainActivity_split_1file(JNIEnv * env, jobject obj, jstring splitFilePath, jint number, jstring outPath){ //分隔文件的路径 char * splitFilePathChar = (*env)->GetStringUTFChars(env,splitFilePath,NULL); //占位符路径 如 d:xxx%d.jpg char * outPathChar = (*env)->GetStringUTFChars(env,outPath,NULL); //输出分割文件的数组指针 FILE ** fileArrayP = calloc(number,sizeof(FILE *)); //分割数据FILE FILE * splitFile = fopen(splitFilePathChar,"rb"); //文件大小 long fileSize =file_Size(splitFilePathChar); //每个每个文件大小 long file_black_size [number]; LOGE("文件总大小:%ld",fileSize); //初始化循环变量 int var = 0; //每个分割文件大小 long blackSize = fileSize/number; //循环遍历赋值每个文件 for (; var < number; ++var) { //每一个输出文件的地址 char * outEachPath = calloc(200,sizeof(char)); //格式化文件输出路径 sprintf(outEachPath,outPathChar,var); //每个文件指向 fileArrayP[var] = fopen(outEachPath,"wb"); //释放 free(outEachPath); //最后一个 if(var==number-1){ //最后一个文件的大小 防止不能被整除 file_black_size[number-1] = blackSize+fileSize%number; }else{ //每个文件的文件大小 注意如果文件大小不能被number整数那么最后一个文件大小需要重新计算赋值 file_black_size[var] =blackSize; } } //从文件中读取的byte int ch; long current = 0;//当前进度 //所有分割数 for (var = 0; var < number; ++var) { //最后一块 if(var==number-1){ while((ch = fgetc(splitFile))!=EOF){ fputc(ch,fileArrayP[var]); } }else{ while(current<blackSize){ ch = fgetc(splitFile); current++; fputc(ch,fileArrayP[var]); } } fclose(fileArrayP[var]); //充值下标 current = 0; } free(fileArrayP); //释放指向 (*env)->ReleaseStringUTFChars(env,splitFilePath,splitFilePathChar); (*env)->ReleaseStringUTFChars(env,outPath,outPathChar);}
0 0
- NDK拆分合并文件
- 安卓NDK开发案列三:文件的拆分与合并
- Android NDK系列(六)- 文件拆分与合并
- [java]拆分、合并文件
- java 文件拆分 合并
- java 文件拆分与合并
- c++ 合并文件以及拆分
- 用rdiff拆分合并文件
- Java文件拆分与合并
- 文件的拆分与合并
- 文件拆分与合并(VE)
- Java文件拆分与合并
- Java文件拆分与合并
- 文件的合并与拆分
- 文件流的合并与拆分
- 【shell命令】拆分、合并、排序、比较文件
- javaIO学习之拆分与合并文件
- Java文件的拆分与合并(二)
- 如何从gitlab克隆项目到本地,然后使用SourceTree进行代码管理
- protobuf反射详解
- Ubuntu16.04虚拟机设置固定IP上网
- vue2+vue-router2+webpack实战(一)
- android 状态栏总结
- NDK拆分合并文件
- elasticsearch集群生态介绍,分片及其水平扩展
- Redis常用数据类型详解
- CSDN学霸课表——系统集成项目管理工程师(软考中级)
- 第 6 章 数据存储
- 代码设置文字大小sp
- zoj Modular Inverse
- 小数的处理
- C++实验3——个人所得税计算器