转载- 支持Android4.0以下webp的使用

原文地址:

http://blog.csdn.net/jiwangkailai02/article/details/17015451

支持Android4.0以下webp的使用

分类: Android相关2013-11-30 16:53 1658人阅读 评论(2) 收藏 举报

AndroidWebp

最近项目中需要使用到webp,主要目的是减少网络流量(同一张图片,webp格式能比jpg格式小约30%)。但是Android在4.0以上BitmapFactory才支持webp,今天的操作就是要使Android4.0以下的版本也能进行webp的解压缩。

首先,需要搭建NDK开发的环境

1.下载并安装Cygwin

Cygwin下载地址:http://www.cygwin.com/

按照向导一路向下,(使用默认的镜像路径http://www.mirrors.163.com/,这个貌似比较快)。

到达这一步:

选择Devel,点开。选择我们必须安装的5个组件:binutils ,gcc(包含core和g++) ,gcc-mingw(包含core和g++) ,gdb,make。(有的时候你需要更多的组件,根据自己需要再安装)

选择完后,点击下一步,直到安装完成。

运行cygwin,输入make -v 和 gcc -v 如果能显示版本,则表示安装成功。

2.下载并配置NDK

NDK下载地址:http://developer.android.com/tools/sdk/ndk/index.html

NDK安装很简单,下载完成后把文件解压到指定的位置即可。

NDK环境配置:

修改Cygwin目录/home/<username> 下的.bash_profile文件,在文件末尾加入如下代码:

ANDROID_NDK_ROOT=/cygdrive/解压后NDK文件的路径 /*(例如:/cygdrive/d/android-ndk-r9b)*/

export ANDROID_NDK_ROOT

至此,准备工作已经完毕。

其次,我们需要下载并编辑webp的源文件

我们使用最新的0.3.1版本的webp源文件,下载地址为:http://code.google.com/p/webp/downloads/detail?name=libwebp-0.3.1.tar.gz&can=2&q=

下载完成后,解压缩,提出Android.mk文件、src文件夹和swig文件下的libwebp.jar文件和libwebp_java_wrap.c文件。并将libwebp_java_wrap.c文件移动到src文件夹下。

在工程目录下新建名字为jni的文件夹。然后将Android.mk文件、src文件夹移动到jni文件夹下。最后,将libwebp.jar引入到工程中。

编辑Android.mk文件夹,在include $(CLEAR_VARS)
LOCAL_SRC_FILES := \中添加:src/libwebp_java_wrap.c \

并将include $(BUILD_STATIC_LIBRARY)该为include $(BUILD_SHARED_LIBRARY)

如下:

(BUILD_STATIC_LIBRARY和BUILD-SHARED_LIBRARY的区别参考:http://stackoverflow.com/questions/2649334/difference-between-static-and-shared-libraries

然后在jni文件夹下创建Application.mk文件,编辑内容如下:

# The ARMv7 is significanly faster due to the use of the hardware FPU
APP_ABI := armeabi armeabi-v7a
APP_PLATFORM := android-8

其中APP_PLATFORM设定为支持的SDK最低版本。

保存后,我们启动Cygwin,然后通过cd指令进入到我们工程的文件夹下,执行指令:$NDK/ndk-build。

等到编译结束:

至此so库已经生成(查看libs文件夹就会发现对应的.so文件。同时你会发现工程目录下多了一个obj文件夹,而且还不小。放心,它只是生成so文件的中间文件,不会打包到apk中)。

接下来的任务是使用JNI调用so库进行应用层的开发了。

应用层的开发工程一般如下:

1. 加载so库。

[java] view plaincopy

  1. static {
  2. System.loadLibrary("webp");//loadLibrary和Android.mk中LOCAL_MODULE:= **的定义相关,我们在Android.mk中定义为webp,这里就写webp。
  3. }

2.声明与Native方法相对应的方法。

native方法是:

[cpp] view plaincopy

  1. SWIGEXPORT jint JNICALL Java_com_google_webp_libwebpJNI_WebPGetDecoderVersion(JNIEnv *jenv,
  2. jclass jcls) {
  3. jint jresult = 0 ;
  4. int result;
  5. (void)jenv;
  6. (void)jcls;
  7. result = (int)WebPGetDecoderVersion();
  8. jresult = (jint)result;
  9. return jresult;
  10. }

native方法命名规则为:Java_包名_类名_应用层方法名。其中包名中的点被下划线替代。
应用层中需用生命的方法为:

[java] view plaincopy

  1. public static final native int WebPGetDecoderVersion();

应用层只用声明,不用定义,但要加上native关键字。

3.使用应用层声明的方法。

下面我们按照上述方法来在应用层使用我们刚生成的so库

记得有一个libwebp.jar文件不,这个jar已经把应用层声明的native方法搞好了,而且帮我们封装了一层,我们只用调用其方法就ok了,但是我们还是要加载so库,因为这个它没有帮我们实现。

我们写两个方法:

[java] view plaincopy

  1. static {
  2. System.loadLibrary("webp");
  3. }
  4. private Bitmap webpToBitmap(byte[] encoded) {
  5. int[] width = new int[] { 0 };
  6. int[] height = new int[] { 0 };
  7. byte[] decoded = libwebp.WebPDecodeARGB(encoded, encoded.length, width,
  8. height);
  9. int[] pixels = new int[decoded.length / 4];
  10. ByteBuffer.wrap(decoded).asIntBuffer().get(pixels);
  11. return Bitmap.createBitmap(pixels, width[0], height[0],
  12. Bitmap.Config.ARGB_8888);
  13. }
  14. public static boolean isWebp(byte[] data) {
  15. return data != null && data.length > 12 && data[0] == ‘R‘
  16. && data[1] == ‘I‘ && data[2] == ‘F‘ && data[3] == ‘F‘
  17. && data[8] == ‘W‘ && data[9] == ‘E‘ && data[10] == ‘B‘
  18. && data[11] == ‘P‘;
  19. }

基于这两个方法,我们可以对webp图片进行解压缩。

下面有一个demo,大家可以参考下:

Webp解压缩Demo

参考资料:

android官方对NDK开发的介绍:http://developer.android.com/tools/sdk/ndk/index.html

stackoverflow上一个人的经验介绍:http://stackoverflow.com/questions/7032695/webp-for-android

时间: 2024-10-10 16:49:48

转载- 支持Android4.0以下webp的使用的相关文章

[转]使用ant让Android自动打包的build.xml,自动生成签名的apk文件(支持android4.0以上的版本)

在android4.0以后的sdk里那个脚本就失效了,主要是因为 apkbuilder这个程序不见了: 人家sdk升级,我们的脚本也要跟上趟,修改一下喽. 上网一查,大家的文章还停留在我去年的脚本程度,算了,自己动手查阅了资料之后,具体实现如下: 在工程的根目录 创建2个文件,分别: 1.build.xml 2.build.properties build.xml的内容: [java] view plaincopyprint? <?xml version="1.0" encodi

android4.0蓝牙使能的详细解析 (转载)

此博客是转载过来的哦... 给自己博客定几个部分: (1)写在前面的话:一些写博客时的废话. (2)内容简介:把文章的主要内容或者核心部分作一个框架性的概括,以方便大家阅读. (3)正文:这个不需要解释了.   写在前面的话:这是csdn上的第一篇博客,希望自己能够坚持写下去,也希望能够得到大家的支持.本文可能会涉及大量的源码注释,在文字方面可能不够尽如人意,希望真正想理解该过程的同学们能够耐心看下去. 内容简介:本文详细分析了android4.0中蓝牙使能的过程,相比较android2.3,4

android4.0蓝牙使能的详细解析

此博客是转载过来的哦... 给自己博客定几个部分: (1)写在前面的话:一些写博客时的废话. (2)内容简介:把文章的主要内容或者核心部分作一个框架性的概括,以方便大家阅读. (3)正文:这个不需要解释了.   写在前面的话:这是csdn上的第一篇博客,希望自己能够坚持写下去,也希望能够得到大家的支持.本文可能会涉及大量的源码注释,在文字方面可能不够尽如人意,希望真正想理解该过程的同学们能够耐心看下去. 内容简介:本文详细分析了android4.0中蓝牙使能的过程,相比较android2.3,4

centos7 apache配置ssl支持tlsv1.0 1.1 1.2

centos7 apache配置ssl支持tlsv1.0 1.1 1.2原创93dd大智若愚 最后发布于2017-05-11 17:25:39 阅读数 2162 收藏展开按照阿里云的证书配置如下安装证书: 文件说明: 1. 证书文件214089425050896.pem,包含两段内容,请不要删除任何一段内容. 2. 如果是证书系统创建的CSR,还包含:证书私钥文件214089425050896.key.证书公钥文件public.pem.证书链文件chain.pem. ( 1 ) 在Apache的

IOS 实现自定义的导航栏背景以及自定义颜色的状态栏(支持7.0以及低版本)

为尊重文章原作者,转载务必注明原文地址:http://www.cnblogs.com/wt616/p/3784717.html 先看效果图: 在自定义导航栏背景时,可能会遇到以下一些问题: 1.当设置导航栏背景后,状态栏的颜色也会跟着一起改变掉,这可能不是你说希望看到的 2.IOS7以上的版本和低版本显示出来的导航栏高度位置有差别,这个差别就是状态栏的高度20,为了兼容低版本,必须统一 解决思路: 1.不正常的是状态栏的背景也一起变了,而状态栏的文字是可以通过其他API去设置的:如 [[UIAp

浅谈android4.0开发之GridLayout布局

作者:李响 本文重点讲述了自android4.0版本号后新增的GridLayout网格布局的一些基本内容,并在此基础上实现了一个简单的计算器布局框架.通过本文,您可以了解到一些android UI开发的新特性,并可以实现相关应用. 在android4.0版本号之前,假设想要达到网格布局的效果,首先能够考虑使用最常见的LinearLayout布局,可是这种排布会产生例如以下几点问题: 1.不能同一时候在X,Y轴方向上进行控件的对齐. 2.当多层布局嵌套时会有性能问题. 3.不能稳定地支持一些支持自

Ubuntu12.04下载Android4.0.1源码全过程,附若干问题解决[转]

学校里一直在做应用层开发,考虑到日后就业问题,这次决定研究源码和驱动,并进行编译.没想到就下载源码这一步折腾了我整整两天,期间遇到很多问题,哎,记录于此,希望日后再下源码的人不要再走无谓的弯路了.事实上可以在这里http://zhu.im/Android/下载源码,但是google推荐用repo来下载,为了多学东西就学下repo吧,毕竟下现成的也太么含量了.最初我参考的是老罗的博客http://blog.csdn.net/luoshengyang/article/details/6559955

android4.0.4 增加HDMI设置

最近到4412最基本的都调了 然后觉得没事做了 所以增加一个HDMI的设置 不能闲着 以下使用的是广州斯道的icool210开发板 源码修改如下 最开始我是先在设置里加上这些设置然后在去实现功能 这里就一起说了 之前android2.3里有HDMI设置所以这里就参照那个增加 首先修改Setting 查看libhdmi库首先查看下hdmi能设置的格式 源码路径 device/samsung/common/s5p/libhdmi/SecHdmi.cpp 你会发现有如下代码 mHdmiResoluti

Android4.0中AppWidget的一些新玩意体验---RemoteViewsService

最近要把之前做的2.3上面的一些程序移植到4.0上面来,  几乎所有的AppWidget都是我一手操办, 所以这个玩意都是我弄. 我把Android2.3的代码直接拷到4.0的环境下面, 编译然后Push,  直接可以跑, 这是木有问题的.  但是我发现4.0上面有一些新东东是之前2.3上面没有的, 我也读了下官方的文档, 做了些demo, 这里总结给大家, 在以后需要做AppWidget的时候可以得心应手. 1: 应用列表中的预览图 如果你不想你的Widget在应用列表里面显示成那个丑机器人图