Ndk编译zip

2015/03/09

本文原创作者:Cloud Chou. 欢迎转载,请注明出处和本文链接

概述

busybox工具集带的压缩工具主要有tar,bzip2,unzip等工具,但是不带zip工具,故此在手机上通过执行命令的方式不能创建zip包,也不能将新文件压缩到一个已有的zip文件里。

本篇主要讲述如何使用Ndk编译infozip源码,生成在手机上可运行的静态链接的zip可执行文件,在系统模式和Recovery模式都可正常运行。

本篇讲述的代码在Github上可直接下载,地址如下所示:

https://github.com/cloudchou/ndkzip

环境准备

  • 1)准备Ndk开发环境

    http://developer.android.com/tools/sdk/ndk/index.html

    下载合适的Ndk并安装,将Ndk命令添加到Path环境变量

  • 2)准备源代码

    从Github上下载源代码:

    https://github.com/cloudchou/ndkzip

    ndkzip是一个android项目工程。

    jni目录下有一个Android.mk文件,该Makefile描述编译规则。

    另外有两个子模块,zip模块和bzip模块,zip模块对应的就是infozip源代码,因为我们添加了对bzip的支持,故此还需要bzip子模块。

编译

使用ndk-build.cmd 即可编译

执行

1
2
3
adb push  libs/armeabi/zip /data/local/tmp/zip  
  && adb shell chmod 755 /data/local/tmp/zip 
    && adb shell /data/local/tmp/zip

执行效果如下图所示

zip

重要说明

  • 1)unicode支持

    infozip源码可支持unicode,只要系统库支持unicode,可在Makefile里添加对unicode的支持。只需在编译源码用的CFLAGS里添加-DUNICODE_SUPPORT即可。infozip实现对unicode的支持时会调用mbstowcs将多字节字符串转换为宽字符串,因此如果系统对mbstowcs支持不好,那么即便在makefile开启了UNICODE支持,那么也会导致zip运行不正常。

    因为android底层C库对mbstowcs支持不好,故此不支持unicode,需从LOCAL_CFLAGS里将-DUNICODE_SUPPORT去掉(jni/Android.mk中已去掉),否则会导致执行zip命令时出错,提示segement fault。

  • 2)重要Makefile变量说明

    LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/bzip2

    导出本模块的头文件,其它模块可用这些头文件

    TARGET_FORMAT_STRING_CFLAGS :=

    如果我们在C代码里直接写printf(“hello world”),编译时会报错,因为ndk编译核心Makefile文件default-build-commands.mk里有TARGET_FORMAT_STRING_CFLAGS := -Wformat -Wno-error,这个变量会使得编译时认为printf必须有两个参数,导致编译出错。因此在Android.mk里需将TARGET_FORMAT_STRING_CFLAGS变量置空。

    LOCAL_LDFLAGS += -static

    指定链接标记,添加static标记,可使zip静态链接,这样在Recovery模式下也执行zip可执行程序

    LOCAL_STATIC_LIBRARIES := bz

    链接时链接bz静态库

¥打赏5毛

取消

感谢您的支持,我会继续努力的!

扫码支持
赏个5毛,支持我把

打开支付宝扫一扫,即可进行扫码打赏哦

本篇目录