差分包环境搭建
1、将bsdiff-4.3.tar.gz和bzip2-1.0.6.zip文件上传到服务器的某个目录(/home/bsdiff)
- bsdiff下载地址:www.daemonology.net/bsdiff/bsdi…
- bzip2下载地址:sourceforge.net/projects/bz…
2、解压bsdiff源文件(bsdiff-4.3.tar.gz)
tar -xzvf bsdiff-4.3.tar.gz
3、安装bzip2
3.1. 先查找bzip2的库
yum search bzip2
3.2安装bzip2
yum -y install bzip2-devel.x86_64
4、编译bsdiff.c生成可执行文件bsdiff
cd /home/bsdiff/bsdiff-4.3
gcc bsdiff.c -lbz2 -o bsdiff
5、添加Java本地调用方法
进入bsdiff-4.3所在目录( /home/bsdiff/bsdiff-4.3)
1、新建目录 com/leelen/crm/util/
mkdir -p com/leelen/crm/util
2、创建包含native方法的类:LeelenBsDiffUtil.java,包名为:com.leelen.crm.util
cd /home/bsdiff/bsdiff-4.3/com/leelen/crm/util
vim LeelenBsDiffUtil.java
添加文件内容
package com.leelen.crm.util;
public class LeelenBsDiffUtil {
private static LeelenBsDiffUtil instance = new LeelenBsDiffUtil();
public LeelenBsDiffUtil() {
}
public static LeelenBsDiffUtil getInstance() {
return instance;
}
static {
try {
System.loadLibrary("LeelenBsdiff");
} catch (Throwable e) {
e.printStackTrace();
}
}
public native int bsDiffFile(String oldFile, String newFile, String patchFile);
}
3、用javah生成.h方法(或者直接本地生成.h文件上传
cd /home/bsdiff/bsdiff-4.3/
javac com/leelen/crm/util/LeelenBsDiffUtil.java
javah com.leelen.crm.util.LeelenBsDiffUtil
4、修改bsdiff.c并编译成.so
4.1导入Java中的jni.h和jni_md.h文件到/home/bsdiff/bsdiff-4.3/中
#查找jkd安装路径
which java #/usr/java/jdk1.8.0_172/bin/java
#进入jdk目录
cd /usr/java/jdk1.8.0_172
#拷贝jni.h和jni_md.h文件
cp include/jni.h /home/bsdiff/bsdiff-4.3/
cp include/linux/jni_md.h /home/bsdiff/sdiff-4.3/
4.2bsdiff.c文件中添加com_leelen_crm_util_LeelenBsDiffUtil.h头文件,并把它们中的#include <jni.h> 改成#include “jni.h”
cd /home/bsdiff/bsdiff-4.3/
vim bsdiff.c
#include "com_leelen_crm_util_LeelenBsDiffUtil.h"
4.3修改com_leelen_crm_util_LeelenBsDiffUtil.h文件将#include <jni.h> 改成#include “jni.h”
vim com_leelen_crm_util_LeelenBsDiffUtil.h
#将#include 改成#include “jni.h” 如下
4.4bsdiff.c中实现com_leelen_crm_util_LeelenBsDiffUtil.h中的native方法
vim bsdiff.c
在bsdiff.c底部添加如下内容,并保存退出
`JNIEXPORT jint JNICALL Java_com_leelen_crm_util_LeelenBsDiffUtil_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] = "leelenBsdiff";
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;
}`
4.5编译bsdiff.c成.so文件
gcc bsdiff.c -lbz2 -fPIC -shared -o libLeelenBsdiff.so
4.6将libLeelenBsdiff.so拷贝到linux库中
cp libLeelenBsdiff.so /usr/lib/
4.7编写BsDiffTest.java文件
vim BsDiffTest.java
文件内容,保存退出
import com.leelen.crm.util.LeelenBsDiffUtil;
public class BsDiffTest {
private static String oldFile = "app_old1.apk";
private static String newFile = "app_new1.apk";
private static String patchFile = "app_patch1.patch";
public static void main(String[] args)
{
int result = LeelenBsDiffUtil.getInstance().bsDiffFile(oldFile, newFile, patchFile);
System.out.println("result:" + result);//0:success 1:wrong
}
}
4.6编译并运行BsDiffTest.java文件
javac BsDiffTest.java
java BsDiffTest
成功生成差分包
4.7最后打包jar文件
javac com.leelen.crm.util.LeelenBsDiffUtil.java
jar cvf leelen-bsdif.jar com/leelen/crm/util/LeelenBsDiffUtil.class