同上节所示:我们在MainActivity中:
定义合成的路径:
mergeFilePath= Environment.getExternalStorageDirectory().getAbsolutePath().toString()+"/xiaoxingyunmerge.mkv";
定义文件合并的方法:
public native void mergeByJNI(String mergeFilePath,String splitFilePath,int num);
利用javap命令获取签名:
hhh:myapplication huozhenpeng$ javap -s -p MainActivity.class
public native void mergeByJNI(java.lang.String, java.lang.String, int);
descriptor: (Ljava/lang/String;Ljava/lang/String;I)V
大部分内容与上一节有重复,下面只记录要修改的:
native-lib.cpp
const JNINativeMethod gMethods[] = {
{
"spliteByJNI","(Ljava/lang/String;Ljava/lang/String;I)V",(void*)native_spliteByJNI
},
{
"mergeByJNI","(Ljava/lang/String;Ljava/lang/String;I)V",(void*)native_mergeByJNI
}
};
JNIEXPORT void JNICALL native_mergeByJNI
(JNIEnv *env, jclass clazz,jstring mergepath,jstring split_path,jint num)
{
LOGI("JNI begin 动态注册的方法 ");
LOGI("JNI begin 合成开始 ");
//首先获取到要合成的文件路径和已经拆分成的文件的路径
const char * merge_p=env->GetStringUTFChars(mergepath,NULL);
const char * split_p=env->GetStringUTFChars(split_path,NULL);
//申请一个二维的char数组,用于存放拆分成的文件的名字
char ** patches=(char **)malloc(sizeof(char *)*num);
//循环为每个文件名申请地址
for(int i=0;i<num;i++)
{
patches[i]=(char *)malloc(sizeof(char)*100);//我们认为每个文件的名字世超不过100个字符的
//把要拆分成的文件的名字进行值替换(替换其中的%d)xiaoxingyun_%d.mkv
sprintf(patches[i],split_p,i);
}
//放置合成后的文件
FILE *fpw=fopen(merge_p,"wb");
for(int i=0;i<num;i++)
{
int size=getFileSize(patches[i]);
FILE *fp=fopen(patches[i],"rb");
for(int j=0;j<size;j++)
{
fputc(fgetc(fp),fpw);
}
fclose(fp);
}
fclose(fpw);
for(int i=0;i<num;i++)
{
free(patches[i]);
}
free(patches);
env->ReleaseStringUTFChars(mergepath,merge_p);
env->ReleaseStringUTFChars(split_path,split_p);
LOGI("JNI begin 合成结束 ");
}
看下结果:
可以测试下合成后的文件,是可以正常播放的额