最近要在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各類功能了