Android增量更新-差分文件(Windows-part2)-dll动态库和jar包

Posted ywl5320

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android增量更新-差分文件(Windows-part2)-dll动态库和jar包相关的知识,希望对你有一定的参考价值。

 

我的视频课程:《FFmpeg打造Android万能音频播放器》

我的视频课程(编码直播推流):《Android视频编码和直播推流》

 

目录:

 

 

        android增量更新(一)-差分文件(Windows-part1)

        Android增量更新(二)-差分文件(Windows-part2)-dll动态库和jar包

        Android增量更新(三)-差分文件(Linux)-生成jar和.so库

        Android增量更新(四)-客户端合并差分包生成新的apk安装包

        移动大脑-SpringMVc搭建RestFul后台服务(七)-增量更新

 

        上一篇博客《Android增量更新(一)-差分文件(Windows-part1)》中,已经通过VS把bsdiff源码编译成了.exe的可执行文件,为了更好地给第三方语言调用,现在准备把bsdiff编译成.dll动态库,这样很多语言都可以顺利方便的使用了,这里以Java调用为例:

设计思路如下:

        既然bsdiff是c和c++写的,我们又需要在Java中调用,所以就可以在Java中声明一个本地方法,把旧文件、新文件和差分文件以参数的形式传到bsdiff.cpp的main函数中。因此就会在bsdiff.cpp中实现一个Java的方法,然后在方法中调用main方法,最终实现差分功能。那么开始动手吧。

一、用idea(也可用eclipse等)创建一个java项目,并创建一个包含native方法的类BsDiffYwl5320Util.java。

1.1、项目BsDiffYwl5320目录结构如下:

 

1.2、编译项目生成.class文件,并用命令javah把native方法生成相应的.h文件,如图:

 

二、编译dll动态库

2.1、把第一步里面的.h头文件移动到VS项目中的include里面,并添加到头文件里面:

 

2.2、这是打开文件com_ywl5320_bsdiff_BsDiffYwl5320Util.h为提示找不到jni.h头文件,所以我们还需要到windows的java目录下把相应的jni.h也添加到项目中,由于jni.h里面引用了jni_md.h头文件,所以需要把这两个头文件都复制到项目中才行:

2.2.1、jni.h和jni_md.h的位置如下

 

2.2.2、复制到VS项目中后目录如下

 

三、在bsdiff.cpp中实现java中的native方法

3.1、导入.h文件,并在文件末尾实现方法,因为main函数有特殊用处,最好不要直接用main方法,这里把main方法改成了bsdiff_main:

 

JNIEXPORT jint JNICALL Java_com_ywl5320_bsdiff_BsDiffYwl5320Util_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(joldfile, NULL);
	char *newpath = (char*)env->GetStringUTFChars(jnewfile, NULL);
	char *patchPath = (char*)env->GetStringUTFChars(jpatchfile, NULL);
	argv[0] = "bsdiff_ywl5320";
	argv[1] = oldPath;
	argv[2] = newpath;
	argv[3] = patchPath;

	restlt = bsdiff_main(argc, argv);

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

 

 

3.2、添加64位平台,如下:

 

3.3、由于更改了编译平台,所以前面的include、SDL编译检查等还得重新配置一下,这里就不讲了,步骤可以看上一篇博客。

3.4、更改生成类型由.exe改成.dll:

 

3.5、最后编译生成我们需要的.dll动态库:

这样就生成了我们需要的BsDiffYwl5320.dll动态库了。

 

四、Java中调用BsDiffYwl5320.dll库实现分包:

4.1、复制动态库和测试apk到项目根目录下

 

4.2、加载动态库

 

package com.ywl5320.bsdiff;

/**
 * Created by ywl on 2017-10-23.
 */
public class BsDiffYwl5320Util 

    private static BsDiffYwl5320Util instance = new BsDiffYwl5320Util();

    public BsDiffYwl5320Util()

    public static BsDiffYwl5320Util getInstance()
    
        return instance;
    

    static
    
        System.loadLibrary("BsDiffYwl5320");
    


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


 

 

4.3、调用native方法测试

成功生成了.patch包

 

4.4、为了获取执行状态,所以把bsdiff.cpp里面的错误方法改成带返回值的,并去掉里面的退出语句exit()

 

template<class T>
int err(int i, const char* str, T arg) 
	printf(str, arg);
	return i;

int err(int i, const char* str) 
	printf(str);
	return i;

template<class T>
int errx(int i, const char* str, T arg) 
	printf(str, arg);
	return i;

int errx(int i, const char* str) 
	printf("%s",str);
	return i;

 

 

 

 

 

4.5、打包jar包,方便调用

 

4.6、以jar方式调用dll差分测试:

 

测试成功,这样在Windows平台上面就完成了apk的差分,可以直接用到服务器差分里面。不管你是客户端工程师还是服务器端工程师,通过本篇文章都能自己实现apk的差分,是不是感觉自己棒棒的,哈哈。

下一篇文章介绍Linux(Ubuntu)平台上面生成差分包,毕竟Linux服务器是主流。

 

源码下载:GitHub BsDiffYwl5320

 

 

 

 

 

 

 

以上是关于Android增量更新-差分文件(Windows-part2)-dll动态库和jar包的主要内容,如果未能解决你的问题,请参考以下文章

Android增量更新-差分文件(Linux)-生成jar和.so库

Android增量更新-差分文件(Linux)-生成jar和.so库

Android差分升级原理和实现方式

android黑科技系列——应用市场省流量更新(增量升级)原理解析

jenkins根据SVN增量更新

手把手教你在Java后端使用bsdiff实现增量更新