同上節(jié)所示:我們在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
大部分內(nèi)容與上一節(jié)有重復(fù)辰如,下面只記錄要修改的:
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 動態(tài)注冊的方法 ");
LOGI("JNI begin 合成開始 ");
//首先獲取到要合成的文件路徑和已經(jīng)拆分成的文件的路徑
const char * merge_p=env->GetStringUTFChars(mergepath,NULL);
const char * split_p=env->GetStringUTFChars(split_path,NULL);
//申請一個二維的char數(shù)組逻翁,用于存放拆分成的文件的名字
char ** patches=(char **)malloc(sizeof(char *)*num);
//循環(huán)為每個文件名申請地址
for(int i=0;i<num;i++)
{
patches[i]=(char *)malloc(sizeof(char)*100);//我們認(rèn)為每個文件的名字世超不過100個字符的
//把要拆分成的文件的名字進(jìn)行值替換(替換其中的%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 合成結(jié)束 ");
}
看下結(jié)果:
image.png
可以測試下合成后的文件留特,是可以正常播放的額
image.png
image.png