本案例环境,软件版本
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文件夹中
编译
执行