您的位置:首页 > 移动开发 > Android开发

Android项目通过NDK整合libjpg与libpng

2016-03-26 21:36 656 查看
libjpg与libpng是处理图片的两个非常重要的库,其中libjpg是处理jpg图片解压与压缩的利器,但是不足的是,libjpg只能处理jpg相关的图或位图,所以若遇到png图片则需要通过另外一个库,libpng来处理。所以通常项目需要整合两个库来完成图片的各种需求。

为了将libjpeg与libpng和项目编译成一个动态链接库,这里我们将libjpeg与libpng编译成静态库,引入进项目之中。

1、目录结构

我们为了统一编译,会将libjpeg与libpng同时放在项目中,libpng编译的时候需要zlib支持,所以目录结构为:

-jni

----jpeg

---------*.c *.h

---------Android.mk

-----png

-----------*.c *.h

----------Android.mk
-----zlib

-----------*.c *.h

----------Android.mk

-----Android.mk


2、libjpeg库

这里我们使用的是libjpeg-turbo库。

下载libjpeg-turbo:

git clone git://git.linaro.org/people/tomgall/libjpeg-turbo/libjpeg-turbo.git -b linaro-android


然后将clone出来的项目文件夹中的所有文件复制到
jni/jpeg/
目录下。修改
Android.mk
文件,找到
libjpeg.so
注释,将
include $(BUILD_SHARED_LIBRARY)
改成
include $(BUILD_STATIC_LIBRARY)


3、png库

我们在libpng官网上下载libpng项目及关联的zlib项目。

解压zlib项目,并将项目所有文件复制到
/jni/zlib/
中。在zlib文件夹中添加Android.mk预编译脚本:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:= zlib
LOCAL_SRC_FILES:= \
adler32.c \
compress.c \
crc32.c \
deflate.c \
gzclose.c \
gzlib.c \
gzread.c \
gzwrite.c \
infback.c \
inflate.c \
inftrees.c \
inffast.c \
trees.c \
uncompr.c \
zutil.c

LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)
include $(BUILD_STATIC_LIBRARY)


然后解压libpng项目,此时不能直接将所有文件复制到项目中,否则在编译的时候会找不到
pnglibconf.h
头文件,需要将
scripts\pnglibconf.h.prebuilt
复制到libpng项目根目录下重命名为
pnglibconf.h


cd cd libpng-1.6.21/
cp scripts\pnglibconf.h.prebuilt ../pnglibconf.h


然后将项目文件夹下所有文件复制到
jni/png/
文件夹下,并添加预编译文件
Android.mk
:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE    := libpng
LOCAL_SRC_FILES :=\
png.c \
pngerror.c \
pngget.c \
pngmem.c \
pngpread.c \
pngread.c \
pngrio.c \
pngrtran.c \
pngrutil.c \
pngset.c \
pngtest.c \
pngtrans.c \
pngwio.c \
pngwrite.c \
pngwtran.c \
pngwutil.c

LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/.

include $(BUILD_STATIC_LIBRARY)


3、在项目中添加libjpeg与libpng

操作完前两部以后就可以将libjpeg与libpng的静态链接库引入项目中协同编译了。

修改主项目预编译文件
Android.MK
,增加静态类库引用:

LOCAL_STATIC_LIBRARIES := libjpeg
LOCAL_STATIC_LIBRARIES += libpng
LOCAL_STATIC_LIBRARIES += zlib
LOCAL_C_INCLUDES += $(LOCAL_PATH)/jpeg
LOCAL_C_INCLUDES += $(LOCAL_PATH)/png
LOCAL_C_INCLUDES += $(LOCAL_PATH)/zlib


然后为了在编译项目时同时编译三个库,我们需要将libjpeg,libpng与zlib的预编译文件引入到主项目预编译文件中:

#在预编译文件最后添加
include $(LOCAL_PATH)/jpeg/Android.mk  $(LOCAL_PATH)/png/Android.mk $(LOCAL_PATH)/zlib/Android.mk


此时已经可以在主项目的C文件中引用libjpeg或libpng的头文件进行开发了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: