NDK集成libjpeg和libpng
2019獨角獸企業重金招聘Python工程師標準>>>
最近要在android上使用libjpeg和libpng庫來做些圖片的處理工作,下載了源碼,在pc上使用configure & make & sudo make install,然后參照example.c寫了一些例子,都還不錯。
但是現在要移植到android里面,就需要使用NDK來進行編譯了,試了一些交叉編譯的方法,由于自己對這方面也不是很了解,所以效果不是很理想,最后只能把源碼抽出來放到NDK里面直接編譯了,記錄一下過程。
1. libjpeg庫:
a. 首先下載libjpeg源碼,解壓,進入目錄,執行一下./configure,于是會在當前目錄下生成一個Makefile文件,我們需要根據這個Makefile文件來找到編譯libjpeg庫需要的C源文件有哪些;
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”,這幾個文件實現了不同的內存模型,大概是這意思吧,不同的架構要選取最合適的模型,所以這里面的文件只選其一就可以了,我試了一下,好像差異并不大,都能正常使用,當然,有興趣的可以研究一下源碼。
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庫可正常使用ls
f. 使用NDK編譯:源文件我們都有了,然后直接把文件放到jni目錄下,編寫Android.mk文件,就能順利生成NDK下能正常使用的libjpeg.so庫了
?
2. libpng:
方法同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各種功能了
轉載于:https://my.oschina.net/redhouse/blog/77529
總結
以上是生活随笔為你收集整理的NDK集成libjpeg和libpng的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: git常用的六个命令是什么
- 下一篇: Nvidia DX10 Lighting