NDK集成libjpeg和libpng

最近要在android上使用libjpeg和libpng庫來作些圖片的處理工做,下載了源碼,在pc上使用configure & make & sudo make install,而後參照example.c寫了一些例子,都還不錯。android

可是如今要移植到android裏面,就須要使用NDK來進行編譯了,試了一些交叉編譯的方法,因爲本身對這方面也不是很瞭解,因此效果不是很理想,最後只能把源碼抽出來放到NDK裏面直接編譯了,記錄一下過程。api

1. libjpeg庫:架構

a. 首先下載libjpeg源碼,解壓,進入目錄,執行一下./configure,因而會在當前目錄下生成一個Makefile文件,咱們須要根據這個Makefile文件來找到編譯libjpeg庫須要的C源文件有哪些;post

b. 打開Makefile文件,查看,粗略一看,其實依賴關係挺明確的,首先是經過一些文件生成libjpeg.a庫,而後就是生成了幾個可執行文件,引用了libjpeg.a庫,咱們只關注libjpeg庫,因而找到它引用的那些C源文件,具體見Makefile文件第296行 LIBSOURCES = .........,後面的一大串文件就是咱們編譯libjpeg庫須要用到的C源文件;惟一須要注意的是第307行定義了一個變量「SYSDEPSOURCES = jmemansi.c jmemname.c jmemnobs.c jmemdos.c jmemmac.c」,這幾個文件實現了不一樣的內存模型,大概是這意思吧,不一樣的架構要選取最合適的模型,因此這裏面的文件只選其一就能夠了,我試了一下,好像差別並不大,都能正常使用,固然,有興趣的能夠研究一下源碼。spa

c. 新建文件夾,將剛纔LIBSOURCES 後的文件都複製到文件夾下,而後將*.h文件也都複製過去;圖片

d. 因而咱們如今能夠嘗試根據這些文件來生成libjpeg.so了,運行命令gcc -o libjpeg.so -fPIC -shared *.c,可看到,成功生成了libjpeg.so文件;內存

e. 使用libjpeg.so文件:寫一個簡單的使用libjpeg.so的例子,將libjpeg.so和一些須要的頭文件拷貝到例子程序所在目錄,運行 gcc -o main main.c -I. -L. -ljpeg,可看到咱們編譯的libjpeg.so庫可正常使用lsci

f. 使用NDK編譯:源文件咱們都有了,而後直接把文件放到jni目錄下,編寫Android.mk文件,就能順利生成NDK下能正常使用的libjpeg.so庫了get

 

2. libpng:input

方法同libjpeg,也是找到編譯libpng庫須要的c源文件和頭文件,進行編譯,不一樣的是此次,gcc -o libpng.so -fPIC -shared *.c會出錯,相似 symbol undefined之類的錯誤,看一下log,發現編譯須要使用 zlib庫,因而加上zlib庫的引用 gcc -o libpng.so -fPIC -shared *.c -lz,成功生成libpng.so,一樣編寫例子,發現可正常使用,而後集成到NDK中便可

 

3. NDK集成libpng和libjpeg:

剛開始分別生成了libpng.so和libjpeg.so,而後本地C文件再調用這兩個庫,可是調用過程當中發現會出錯,具體緣由實在是找不出來,因而只能編譯成靜態庫供本地C使用了,這個集成的方式有不少中,我集成後目錄結構以下:

-jni

----jpeg

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

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

-----png

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

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

-----Android.mk

 

其中jpeg和png目錄下放置源碼文件,而後每一個目錄下放置一份Android.mk文件,具體幾個Android.mk文件內容以下:

jpeg Android.mk:

LOCAL_PATH := $(call my-dir)


include $(CLEAR_VARS)


LOCAL_MODULE := jpeg

LOCAL_SRC_FILES := jaricom.c jcapimin.c jcapistd.c jcarith.c jccoefct.c jccolor.c \

        jcdctmgr.c jchuff.c jcinit.c jcmainct.c jcmarker.c jcmaster.c \

        jcomapi.c jcparam.c jcprepct.c jcsample.c jctrans.c jdapimin.c \

        jdapistd.c jdarith.c jdatadst.c jdatasrc.c jdcoefct.c jdcolor.c \

        jddctmgr.c jdhuff.c jdinput.c jdmainct.c jdmarker.c jdmaster.c \

        jdmerge.c jdpostct.c jdsample.c jdtrans.c jerror.c jfdctflt.c \

        jfdctfst.c jfdctint.c jidctflt.c jidctfst.c jidctint.c jquant1.c \

        jquant2.c jutils.c jmemmgr.c jmemansi.c


include $(BUILD_STATIC_LIBRARY)

png下Android.mk:

LOCAL_PATH := $(call my-dir)


include $(CLEAR_VARS)


LOCAL_MODULE := png

LOCAL_SRC_FILES := png.c pngerror.c pngget.c pngmem.c pngpread.c pngread.c pngrio.c \

pngrtran.c pngrutil.c pngset.c pngtrans.c pngwio.c pngwrite.c pngwtran.c \

pngwutil.c

LOCAL_LDLIBS := -lz


include $(BUILD_STATIC_LIBRARY)

根目錄jni下Android.mk:

LOCAL_PATH := $(call my-dir)


include $(CLEAR_VARS)


LOCAL_MODULE := image

LOCAL_SRC_FILES := image_test.c

LOCAL_STATIC_LIBRARIES := jpeg

LOCAL_STATIC_LIBRARIES += png

LOCAL_C_INCLUDES += $(LOCAL_PATH)/jpeg

LOCAL_C_INCLUDES += $(LOCAL_PATH)/png

LOCAL_LDLIBS := -llog


include $(BUILD_SHARED_LIBRARY)


include $(CLEAR_VARS)


include $(LOCAL_PATH)/jpeg/Android.mk  $(LOCAL_PATH)/png/Android.mk


這樣就能成功在android項目中使用libjpeg和libpng各類功能了

相關文章
相關標籤/搜索