android使用giflib加载gif

转载请标明出处:http://77blogs.com/?p=211

背景不多说,反正ndk加载gif比java上加载gif好很多很多,主要体现在内存占用与cpu消耗上。使用ndk加载占用内存更小,消耗的cpu更少。

要使用ndk加载,需要用到giflib库,Android源代码里面其实也用到了这个库。

 

一、下载giflib

https://sourceforge.net/projects/giflib/

 

二、构建so库

1、把需要用到的代码拷贝进来

语法上就不多说了。

注意还需要用到log库和 jnigraphics库,一个是用来打印log,一个是用来图片解析的时候用到。

 

3、新建java类GifHandler,在里面新建本地方法,方便等会直接用快捷方式在native-lib里面生成

通过这些方法获取宽度,高度,帧数,渲染,打开文件。

 

4、native-lib代码,这里编写我们的本地代码

首先需要引进的头文件有:

<android/bitmap.h>NDK中带的头文件,解析图片要用到。

gif.h我们自己新建的头文件,等会讲

 

首先看openFile方法

这个方法主要是获取到GifFileType的指针地址。

 

GifFileType里面有gif文件的各种信息,定义在gif_lib.h里面。

 

从注释也可以看出具体的含义。

顺便说一下UserData,这个其实相当于tag,类似于可以给一个view  tag标识。

 

获取到到GifFileType之后便可以通过它获取宽度,高度,帧数,方法如下:

获取到相关信息后,我们就要进行渲染了。

先讲一下我们的原理,我们的原理是获取到信息。通过宽高构造一个bitmap,根据每一帧图片之间的间隔,拿这个bitmap去渲染,也就是通过这个延时时间循环去加载每一帧图片。

renderFrameN方法

AndroidBitmap_lockPixels(env, bitmap, &pixels)这个方法必须调用,它会锁定图片内存,同时呢,成功的话pixels会指向图片的地址。

相应的,下面就必须解除锁定:AndroidBitmap_unlockPixels(env, bitmap)

 

核心方法是这一句,当然这一句需要我们自定义头文件,也就是上面说到的gif.h

long delay_time = drawFrame(gifFileType, &info, (int *) pixels, index);

 

gif.h如下:

drawFrame方法如下,关于gif文件格式,可以自行百度,后面有空再写:


那么接下来就是主工程的调用了。

到此结束。

源码地址:https://github.com/TZHANHONG/GifLibSample