JAVA 增量更新-Linux生成差分包

本案例环境,软件版本

    CentOS 7.3

    jdk-8u11-linux-x64.tar.gz

    bsdiff-4.3.tar.gz

    bzip2-1.0.6.tar.gz

    

1. 解压bsdiff-4.3.tar.gz

    结构如下:

        

2. 安装bzip2

    1. 在线安装,随便选一个

            yum -y install bzip2-devel.x86_64

        yum -y install bzip2-devel.i686

    2. 源码安装(待解决)

        解压bzip2-1.0.6.tar.gz

        进入解压后的目录执行命令

        make && make install

3. 测试分成差分包

    目录结构

        

    执行命令

    ./bsdiff old.zip new.zip patch.zip  

     

    成功生成了patch差分包

4. 使用java调用

    4.1 创建java类,内容如下

package com.lkb.bsdiff;

/**
 * @author likangbing
 * @date 2018/06/07
 */

public class BsDiffUtil {

    private static BsDiffUtil instance = new BsDiffUtil();

    public static BsDiffUtil getInstance(){
        return instance;
    }

    public native int bsDiffFile(String oldFile, String newFile, String patchFile);

    static{
        System.loadLibrary("BsDiffLkb");
    }
} 

 
 
4.2 用javah生成.h文件
    
    javah com.lkb.bsdiff.BsDiffUtil
    将生成的com_lkb_bsdiff_BsDiffUtil.h该文件放入/usr/lee/bsdiff-4.3(解压目录中)

5. 生成.so文件

    5.1 将jdk中的两个文件移动到/usr/lee/bsdiff-4.3(解压目录中)

         /usr/lib/jvm/jdk1.8/include/linux/jni_md.h

         /usr/lib/jvm/jdk1.8/include/jni.h

    5.2 修改bsdiff.c文件及com_lkb_bsdiff_BsDiffUtil.h文件

        bsdiff.c添加如下内容

            

        com_lkb_bsdiff_BsDiffUtil.h修改如下内容

            

    5.3 在bsdiff.c末尾添加native方法的实现

JNIEXPORT jint JNICALL Java_com_lkb_bsdiff_BsDiffUtil_bsDiffFile
        (JNIEnv *env, jobject jobj, jstring joldfile, jstring jnewfile, jstring jpatchfile)
{
    int restlt = -1;
    int argc = 4;
    char *argv[4];

    char *oldPath = (char*)(*env)->GetStringUTFChars(env, joldfile, NULL);
    char *newpath = (char*)(*env)->GetStringUTFChars(env, jnewfile, NULL);
    char *patchPath = (char*)(*env)->GetStringUTFChars(env, jpatchfile, NULL);
    argv[0] = "bsdiff";
    argv[1] = oldPath;
    argv[2] = newpath;
    argv[3] = patchPath;

    restlt = main(argc, argv);

    (*env)->ReleaseStringUTFChars(env, joldfile, oldPath);
    (*env)->ReleaseStringUTFChars(env, jnewfile, newpath);
    (*env)->ReleaseStringUTFChars(env, jpatchfile, patchPath);
    return restlt;
}

6. 编译bsdiff.c成.so文件
    执行命令:gcc bsdiff.c -lbz2 -fPIC -shared -o libBsDiffLkb.so
    (
        注意,咱们加载文件方法是System.loadLibrary("BsDiffLkb");
        在Linux下程序默认就会去找libBsDiffLkb
        如果提示找不到.so文件的话
        可以打印一下当前java环境library路径
        System.out.println( System.getProperty("java.library.path"));
        将.so文件放置打印目录的任一位置即可

7. 将.so文件路径添加到系统环境变量中

    vim /ect/profile

    export LIBRARY_PATH=/usr/lee/bsdiff-4.3 (我的.so文件在这个路径)

    source /ect/profile

8. 测试程序代码

import com.lkb.bsdiff.BsDiffUtil;

/**
 * @author lkb
 * @date 2018/06/07
 */
public class Test {

    public static void main(String[] args) {
        System.out.println("开始生成差分包");
        BsDiffUtil.getInstance().bsDiffFile("old.zip","new.zip","patch.zip");
        System.out.println("生成结束");
    }


}

目录结构

        

   把文件放置解压后的bsdiff-4.3文件夹中

        

        编译

        

       执行

        

猜你喜欢

转载自blog.csdn.net/qq_32419835/article/details/80610866