本案例环境,软件版本
CentOS 7.3
jdk-8u11-linux-x64.tar.gz
bsdiff-4.3.tar.gz
bzip2-1.0.6.tar.gz
github:点击打开链接
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 Conbing
* @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 LD_LIBRARY_PATH=.
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文件夹中
编译
执行