第十三节(文件合并)

同上节所示:我们在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 合成结束 ");
}

看下结果:

image.png

可以测试下合成后的文件,是可以正常播放的额

image.png
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容