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

最近项目中需要使用到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

版权声明:本文为博主原创文章,未经博主允许不得转载。

支持Android4.0以下webp的使用相关推荐

  1. UT-Exynos4412 三星ARM四核旗舰开发平台android4.0体验-10HDMI功能调试支持

    经过2012年的等待,四核的开发平台终于跟广大嵌入从业人员见面了,下面让我们来看下UT-Exynos 4412 开发板的详细参数吧,共广大嵌入式开发人员参考. 一.UT-Exynos 4412开发板高 ...

  2. UT-Exynos4412 三星ARM四核旗舰开发平台android4.0体验-5联通3G功能调试支持

    经过2012年的等待,四核的开发平台终于跟广大嵌入从业人员见面了,下面让我们来看下UT-Exynos 4412 开发板的详细参数吧,共广大嵌入式开发人员参考. 一.UT-Exynos 4412开发板高 ...

  3. UT-Exynos4412开发板三星ARM四核旗舰开发平台android4.0体验-7GPS功能调试支持

    经过2012年的等待,四核的开发平台终于跟广大嵌入从业人员见面了,下面让我们来看下UT-Exynos 4412 开发板的详细参数吧,共广大嵌入式开发人员参考. 一.UT-Exynos 4412开发板高 ...

  4. Android4.0 SDK新功能详解

    Android 4.0 平台 API等级:14 Android 4.0 是一次重要的平台发布版,为用户和应用程序开发者增加了大量的新特性.在下面我们将讨论的所有新特性和API中,因为它将 Androi ...

  5. Android4.0新特性 中文翻译

    转自http://www.eoeandroid.com/thread-103300-1-1.html android4.0 SDK发布有一段时间了,在eoe上找到了翻译过的新特性说明,特转载 Andr ...

  6. Android4.0新的SDK新特性 (转)

    Android 4.0 是一次重要的平台发布版,为用户和应用程序开发者增加了大量的新特性.在下面我们将讨论的所有新特性和API中,因为它将 Android 3.x 版本中广泛使用的API和全息图像主题 ...

  7. Android4.0新的SDK新特性 (汉化)

    Android 4.0 是一次重要的平台发布版,为用户和应用程序开发者增加了大量的新特性.在下面我们将讨论的所有新特性和API中,因为它将 Android 3.x 版本中广泛使用的API和全息图像主题 ...

  8. Android4.0 SDK新功能详解!

    Android 4.0 平台 API等级:14 Android 4.0 是一次重要的平台发布版,为用户和应用程序开发者增加了大量的新特性.在下面我们将讨论的所有新特性和API中,因为它将 Androi ...

  9. Android4.0 SDK功能详解

    我在eoe的论坛找到的,就复制过来了,跟大家分享一下. Android 4.0 平台 API等级:14 Android 4.0 是一次重要的平台发布版,为用户和应用程序开发者增加了大量的新特性.在下面 ...

最新文章

  1. 分组聚合显示全部列_小胖带你学SQL(三)聚合与排序
  2. leetcode算法题--分裂二叉树的最大乘积
  3. python字符串类型str_python数据类型之字符串类型str
  4. cocos2d-x游戏开发(十)执行单元场景CCScene
  5. 分布式与人工智能课程(part2)--第二课
  6. SAP Spartacus NgExpressEngineDecorator 的工作原理
  7. 【全】Docker(二)-在Docker中部署Nginx实现负载均衡视频教程
  8. 添加dubbo xsd的支持
  9. 装linux服务器进去配置界面,在CentOS 8 Linux上安装和配置SuiteCRM的步骤
  10. (49)Verilog HDL SPI接收设计
  11. 图相处理自学(二):图像处理基本算法Black level / sensor offset/ Shading/ Color Matrix/ AWB(QP值)
  12. 开源大数据周刊-第46期
  13. 【管理心得之二十一】管得少就是管得好
  14. qt qml fuzzyPanel 毛玻璃效果
  15. python入门学习随记(十二)
  16. Eclipse12:CookieSession
  17. 二代测序原理及其流程
  18. c#后台如何导出excel到本地_C#导出EXCEL方法总结
  19. java怎么写dnf辅助_易语言地下城与勇士辅助自动刷图类源码
  20. 聚类篇——(四)有序样品聚类

热门文章

  1. oracle protocol=beq 不可用,Oracle BEQ方式连接配置
  2. spring mvc web.xml 例子
  3. linux虚拟网络设备--eth, tap/tun, veth-pair(九)
  4. java字符串编程_java字符串抉择
  5. mysql如何查看事务日记_MySQL日志查看详解
  6. QT-X11-3.1.2.tar.bz2的使用
  7. Android 设计模式 - 观察者模式
  8. 公开羞辱邻座大码乘客 美国一女乘客被逐下客机
  9. PS摩棒工具如何选中自己想要的区域
  10. MySQL5.6 主从复制配置