增量更新之服务器端解决方案

2019-04-18  本文已影响0人  zhangchunlin

准备工作:

增量更新开源库:http://www.daemonology.net/bsdiff/
bsdiff还依赖bzip: https://sourceforge.net/projects/bzip2

使用步骤

开始撸码

public class BsDiff {
    static { 
        // 这个文件是后面生成的so文件
        System.load("/Users/apple/Desktop/bsdiff/bsdiff.so");
    }
    public static native int diff(String oldPath,
     String newPath, String patchPath);
}
 cd src/main/java/ //进入java目录
 javah top.andnux.update.BsDiff //生成头文件
JNIEXPORT jint JNICALL Java_top_andnux_update_BsDiff_diff
  (JNIEnv *env, jclass clazz, jstring oldPath_, jstring newPath_, jstring patchPath_){
    const char* argv[4];
    argv[1] = (*env)->GetStringUTFChars(env,oldPath_, 0);
    argv[2] = (*env)->GetStringUTFChars(env,newPath_, 0);
    argv[3] = (*env)->GetStringUTFChars(env, patchPath_, 0);
    bsdiff_main(4,argv);
    (*env)->ReleaseStringUTFChars(env,oldPath_, argv[1]);
    (*env)->ReleaseStringUTFChars(env,newPath_, argv[2]);
    (*env)->ReleaseStringUTFChars(env,patchPath_,argv[3]);
    return 0;
 }
cd 到你桌面上文件夹bsdiff下
bsdiff gcc -shared -fPIC -o bsdiff.so *.c
即可得到bsdiff.so文件
public class MainTest {
    public static void main(String args[]) {
        BsDiff.diff("/Users/apple/Desktop/压缩解压.png",
                "/Users/apple/Desktop/压缩解压.png",
                "/Users/apple/Desktop/aa.patch");
    }
}
//在/Users/apple/Desktop/就会生成aa.patch的差分文件。
public class BsDiff {
    static {
        BsDiff.init();
//        System.load("/Users/apple/Desktop/bsdiff/bsdiff.so");
    }
    private static final String SO_NAME = "bsdiff.so";
    public static void init() {
        try {
            InputStream inputStream = Thread.currentThread().getContextClassLoader()
                    .getResourceAsStream(SO_NAME);
            String property = System.getProperty("java.library.path");
            String[] split = property.split(":");
            String s = split[0];
            File file = new File(s, SO_NAME);
            System.out.println(file.getAbsolutePath());
            if (file.exists()) {
                System.load(file.getAbsolutePath());
            } else {
                try {
                    file.getParentFile().mkdirs();
                    file.createNewFile();
                    FileUtils.copyInputStreamToFile(inputStream, file);
                    System.load(file.getAbsolutePath());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static native int diff(String oldPath, String newPath, String patchPath);
}

结束语

上一篇 下一篇

猜你喜欢

热点阅读