NDK学习之增量更新--编译bsdiff得到差分包

前言:

 第一次写博客,所谓的处女作。
 不喜勿喷
 不喜勿喷
 不喜勿喷
 这里我只是简单的实现

环境:

 Windows7 64
 NDK R10
 VS 2013

材料:

bzip2
bsdiff 这里下载windows版
我云盘也有

这里写图片描述

流程:

   服务器:利用bsdiff 项目生成old.apk 与 new.apk 的差分包 apk.patch
   客户端:下载差分包apk.patch与old.apk结合生成new.apk。安装这个new.apk

开动:

   这里还是需要一点JNI基础的,还不了解可以先去get一下。

   既然我们是基于bsdiff,那我们就开始编译bsdiff,解压bsdiff4.3-win32-src

这里写图片描述

  新建一个VS C++项目

这里写图片描述
这里写图片描述

把bsdiff4.3-win32-src中所有的 .c 和 .h 复制到新建的VS项目中,再把我们的jni.h,jni_md.h也加入到VS项目中,这里我删除了 bspatch.cpp (bspatch.cpp是用来合并 apk.patch 与 old.apk),这里我们先实现形成差分包 apk.patch

这里写图片描述

在新建的VS项目把我们复制的文件引入

这里写图片描述

  这里我们配置一下项目,我们这里生产dll库给方便调用

这里写图片描述

 在设置一下 项目 属性 => C/C++ => SDL 检查 ==>否,关闭VS语法检查。

这里写图片描述

  我们在加入两个宏定义 项目 属性 => C/C++ =>命令行

   1)用了不安全的函数  >>加入命令行  -D _CRT_SECURE_NO_WARNINGS
   2)用了过时的函数    >>加入命令行  -D _CRT_NONSTDC_NO_DEPRECATE
   这样全局设置就不用每个类去添加了

这里写图片描述

这里写图片描述

到这里我们就编译好bsdiff。。。。。。。。。。。。。
有木有点儿小激动!!!!!!!!!!!!!!!!

好了,我们要继续踩坑了,抬起我48码的大脚

打开bsdiff.cpp,找到main函数,这就是程序的入口了。
别问我怎么知道,猜的!!!

这里写图片描述

if(argc!=4) errx(1,"usage: %s oldfile newfile patchfile\n",argv[0]);
这行代码很直观的告诉了我们参数应该怎么传,首先判断我们是否传了四个参数。
第一个参数在代码中没有用到,所以我们随便传一个就好。
oldfile:即我们的old.apk路径
newfile:即我们的new.apk路径
patchfile: 即生成的差分包路劲

**注意:路径不要带中文**

终于到我们熟悉的java了

打开elicpse新建一个java项目,这里就要用到JNI的技术了。

这里写图片描述

生成头文件

这里写图片描述
这里写图片描述

再次抬起大脚踩回C++的坑

复制 com_ly_diff_BsDiff.h 到我们的c++ 项目中并添加。(这里记得修改jni.h 为本地的)

在bsdiff.cpp引入我们的com_ly_diff_BsDiff.h并实现函数。
并修改了main函数名称为 diff_main
//JNI 调用
JNIEXPORT void JNICALL Java_com_ly_diff_BsDiff_bsdiff(JNIEnv *env, jclass jcls, jstring oldfile_jstr, jstring newfile_jstr, jstring patchfile_jstr){
    int argc = 4;
    char* oldfile = (char*)env->GetStringUTFChars(oldfile_jstr, NULL);
    char* newfile = (char*)env->GetStringUTFChars(newfile_jstr, NULL);
    char* patchfile = (char*)env->GetStringUTFChars(patchfile_jstr, NULL);

    //参数(第一个参数无效)
    char *argv[4];
    argv[0] = "bsdiff";
    argv[1] = oldfile;
    argv[2] = newfile;
    argv[3] = patchfile;


    diff_main(argc,argv);

    env->ReleaseStringUTFChars(oldfile_jstr, oldfile);
    env->ReleaseStringUTFChars(newfile_jstr, newfile);
    env->ReleaseStringUTFChars(patchfile_jstr, patchfile);
}
编译生成一把,成功即可得到 bsdiff.dll动态库.  位置:项目》X64》debug

这回真的是回到ava了(⊙﹏⊙)b

拷贝我们的bsdiff.dll动态库到APKBsdiff根目录。下面是完整的代码

package com.ly.diff;

public class BsDiff {
    /**
     * @param oldfile
     * @param newfile
     * @param patchfile
     */
    public native static void bsdiff(String oldfile,String newfile,String patchfile);

    /**
     * 加载动态库
     */
    static{
        System.loadLibrary("bsdiff");
    }

    public static void main(String[] args) {
         //APK是我事先生成好的,大家先准备好吧。
         //dn_app_update_new中我是加了几张高清图片
         //dn_app_update_old.apk 为7.54MB,dn_app_update_new.apk为14.1MB,patch生成后为6.48MB
        bsdiff("E:/apk_update/apk/dn_app_update_old.apk","E:/apk_update/apk/dn_app_update_new.apk","E:/apk_update/apk/apk.patch");
   }
}
 直接运行

这里写图片描述

      好了。我会在下一篇博客给大家实现apk合并。。。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值