JNI編譯cximage庫(附android.mk和application.mk文件及詳細步驟)

我們知道cximage是一個非常強大的C++圖片庫,其依賴於jasper庫,png庫,jpeg庫還有其他的幾種庫,因我們項目中只用到了這三個庫,所以我只使用jni編譯這三種庫。
先講一下jni編譯成動態so庫的幾種方式。
1.使用android studio提供的ndk-build編譯的方式。
2.使用linux的交叉編譯器gcc編譯方式。
3.使用tool-chain工具鏈進行編譯。
4.使用android studio的CMakeLists.txt

本文使用的是ndk-build的方式
Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := cximage
#源文件指向
LOCAL_SRC_FILES :=$(LOCAL_PATH)/cximage599c/cximage/CxImage/tif_xfile.cpp $(LOCAL_PATH)/cximage599c/cximage/CxImage/ximabmp.cpp $(LOCAL_PATH)/cximage599c/cximage/CxImage/ximadsp.cpp $(LOCAL_PATH)/cximage599c/cximage/CxImage/ximaenc.cpp $(LOCAL_PATH)/cximage599c/cximage/CxImage/ximaexif.cpp $(LOCAL_PATH)/cximage599c/cximage/CxImage/ximage.cpp $(LOCAL_PATH)/cximage599c/cximage/CxImage/ximagif.cpp $(LOCAL_PATH)/cximage599c/cximage/CxImage/ximahist.cpp $(LOCAL_PATH)/cximage599c/cximage/CxImage/ximaico.cpp $(LOCAL_PATH)/cximage599c/cximage/CxImage/ximainfo.cpp $(LOCAL_PATH)/cximage599c/cximage/CxImage/ximaint.cpp $(LOCAL_PATH)/cximage599c/cximage/CxImage/ximaj2k.cpp $(LOCAL_PATH)/cximage599c/cximage/CxImage/ximajas.cpp $(LOCAL_PATH)/cximage599c/cximage/CxImage/ximajbg.cpp $(LOCAL_PATH)/cximage599c/cximage/CxImage/ximajpg.cpp $(LOCAL_PATH)/cximage599c/cximage/CxImage/ximalpha.cpp $(LOCAL_PATH)/cximage599c/cximage/CxImage/ximalyr.cpp $(LOCAL_PATH)/cximage599c/cximage/CxImage/ximamng.cpp $(LOCAL_PATH)/cximage599c/cximage/CxImage/ximapal.cpp $(LOCAL_PATH)/cximage599c/cximage/CxImage/ximapcx.cpp $(LOCAL_PATH)/cximage599c/cximage/CxImage/ximapng.cpp $(LOCAL_PATH)/cximage599c/cximage/CxImage/ximasel.cpp $(LOCAL_PATH)/cximage599c/cximage/CxImage/ximatga.cpp $(LOCAL_PATH)/cximage599c/cximage/CxImage/ximath.cpp $(LOCAL_PATH)/cximage599c/cximage/CxImage/ximatif.cpp $(LOCAL_PATH)/cximage599c/cximage/CxImage/ximatran.cpp $(LOCAL_PATH)/cximage599c/cximage/CxImage/ximawbmp.cpp $(LOCAL_PATH)/cximage599c/cximage/CxImage/ximawmf.cpp $(LOCAL_PATH)/cximage599c/cximage/CxImage/ximawnd.cpp $(LOCAL_PATH)/cximage599c/cximage/CxImage/xmemfile.cpp
#加入jasper動態庫
LOCAL_LDFLAGS := -L$(LOCAL_PATH)/jasper/local/armeabi -ljasper
#加入png和jpeg動態庫
LOCAL_LDFLAGS += -L$(LOCAL_PATH)/png/libs/armeabi -lpng -L$(LOCAL_PATH)/jpeg/libs/armeabi -ljpeg

LOCAL_LDLIBS := -lz
#加入頭文件目錄
LOCAL_C_INCLUDES := $(LOCAL_PATH)/cximage599c/admin $(LOCAL_PATH)/cximage599c/cximage $(LOCAL_PATH)/cximage599c/cximage/.deps $(LOCAL_PATH)/cximage599c/cximage/CxImage $(LOCAL_PATH)/cximage599c/cximage/CxImage/.deps $(LOCAL_PATH)/cximage599c/cximage/doc $(LOCAL_PATH)/cximage599c/cximage/doc/doxy $(LOCAL_PATH)/cximage599c/cximage/doc/doxy/html $(LOCAL_PATH)/cximage599c/cximage/j2k $(LOCAL_PATH)/cximage599c/cximage/j2k/.deps $(LOCAL_PATH)/cximage599c/cximage/jasper $(LOCAL_PATH)/cximage599c/cximage/jasper/include $(LOCAL_PATH)/cximage599c/cximage/jasper/include/jasper $(LOCAL_PATH)/cximage599c/cximage/jbig $(LOCAL_PATH)/cximage599c/cximage/jbig/.deps $(LOCAL_PATH)/cximage599c/cximage/jpeg $(LOCAL_PATH)/cximage599c/cximage/jpeg/.deps $(LOCAL_PATH)/cximage599c/cximage/png $(LOCAL_PATH)/cximage599c/cximage/png/.deps $(LOCAL_PATH)/cximage599c/cximage/tiff $(LOCAL_PATH)/cximage599c/cximage/tiff/.deps $(LOCAL_PATH)/cximage599c/cximage/zlib $(LOCAL_PATH)/cximage599c/cximage/zlib/.deps

include $(BUILD_SHARED_LIBRARY)

Application.mk


APP_ABI := armeabi

APP_OPIM :=debug
APP_STL := stlport_static
APP_CPPFLAGS := -fexceptions -frtti #允許異常功能,及運行時類型識別
#APP_CPPFLAGS +=-std=c++11 #允許使用c++11的函數等功能
APP_CPPFLAGS +=-fpermissive  #此項有效時表示寬鬆的編譯形式,比如沒有用到的代碼中有錯誤也可以通過編譯;使用GNU STL時不用此項std::string 居然編譯不通過!!

通過Application.mk文件可以知道我要生成armeabiCPU架構的so文件
因爲cximage依賴於其他三個庫,下面附上jasper,png和jpeg的編譯方式

1.jasper庫的編譯,注意jasper庫依賴於jpeg庫,所以先把jpeg庫編譯成功

Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := jasper
#源文件指向
LOCAL_SRC_FILES := $(LOCAL_PATH)/jasper/bmp_cod.c $(LOCAL_PATH)/jasper/bmp_dec.c $(LOCAL_PATH)/jasper/bmp_enc.c $(LOCAL_PATH)/jasper/jas_cm.c $(LOCAL_PATH)/jasper/jas_debug.c $(LOCAL_PATH)/jasper/jas_getopt.c $(LOCAL_PATH)/jasper/jas_icc.c $(LOCAL_PATH)/jasper/jas_iccdata.c $(LOCAL_PATH)/jasper/jas_image.c $(LOCAL_PATH)/jasper/jas_init.c $(LOCAL_PATH)/jasper/jas_malloc.c $(LOCAL_PATH)/jasper/jas_seq.c $(LOCAL_PATH)/jasper/jas_stream.c $(LOCAL_PATH)/jasper/jas_string.c $(LOCAL_PATH)/jasper/jas_tvp.c $(LOCAL_PATH)/jasper/jas_version.c $(LOCAL_PATH)/jasper/jp2_cod.c $(LOCAL_PATH)/jasper/jp2_dec.c $(LOCAL_PATH)/jasper/jp2_enc.c $(LOCAL_PATH)/jasper/jpc_bs.c $(LOCAL_PATH)/jasper/jpc_cs.c $(LOCAL_PATH)/jasper/jpc_dec.c $(LOCAL_PATH)/jasper/jpc_enc.c $(LOCAL_PATH)/jasper/jpc_math.c $(LOCAL_PATH)/jasper/jpc_mct.c $(LOCAL_PATH)/jasper/jpc_mqcod.c $(LOCAL_PATH)/jasper/jpc_mqdec.c $(LOCAL_PATH)/jasper/jpc_mqenc.c $(LOCAL_PATH)/jasper/jpc_qmfb.c $(LOCAL_PATH)/jasper/jpc_t1cod.c $(LOCAL_PATH)/jasper/jpc_t1dec.c $(LOCAL_PATH)/jasper/jpc_t1enc.c $(LOCAL_PATH)/jasper/jpc_t2cod.c $(LOCAL_PATH)/jasper/jpc_t2dec.c $(LOCAL_PATH)/jasper/jpc_t2enc.c $(LOCAL_PATH)/jasper/jpc_tagtree.c $(LOCAL_PATH)/jasper/jpc_tsfb.c $(LOCAL_PATH)/jasper/jpc_util.c $(LOCAL_PATH)/jasper/jpg_dec.c $(LOCAL_PATH)/jasper/jpg_dummy.c $(LOCAL_PATH)/jasper/jpg_enc.c $(LOCAL_PATH)/jasper/jpg_val.c $(LOCAL_PATH)/jasper/mif_cod.c $(LOCAL_PATH)/jasper/pgx_cod.c $(LOCAL_PATH)/jasper/pgx_dec.c $(LOCAL_PATH)/jasper/pgx_enc.c $(LOCAL_PATH)/jasper/pnm_cod.c $(LOCAL_PATH)/jasper/pnm_dec.c $(LOCAL_PATH)/jasper/pnm_enc.c $(LOCAL_PATH)/jasper/ras_cod.c $(LOCAL_PATH)/jasper/ras_dec.c $(LOCAL_PATH)/jasper/ras_enc.c

#導出頭文件
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)\
                           $(LOCAL_PATH)/include/
#加入頭文件
LOCAL_C_INCLUDES := $(LOCAL_PATH)/jasper/.deps $(LOCAL_PATH)/jasper/include $(LOCAL_PATH)/jasper/include/jasper
#LOCAL_CFLAGS := -I$(LOCAL_PATH)/libjpeg
LOCAL_LDFLAGS := -L$(LOCAL_PATH)/jpeg/libs/armeabi -ljpeg
include $(BUILD_SHARED_LIBRARY)

Application.mk


APP_ABI := armeabi

APP_OPIM :=debug
#引入Android原生支持庫,如stdc++
APP_STL := stlport_static
APP_CPPFLAGS := -fexceptions -frtti #允許異常功能,及運行時類型識別
#APP_CPPFLAGS +=-std=c++11 #允許使用c++11的函數等功能
APP_CPPFLAGS +=-fpermissive  #此項有效時表示寬鬆的編譯形式,比如沒有用到的代碼中有錯誤也可以通過編譯;使用GNU STL時不用此項std::string 居然編譯不通過!!

2.jpeg庫的編譯
Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := jpeg
#源文件指向
#LOCAL_SRC_FILES := $(LOCAL_PATH)/jpeg-9b/cdjpeg.c $(LOCAL_PATH)/jpeg-9b/cjpeg.c $(LOCAL_PATH)/jpeg-9b/ckconfig.c $(LOCAL_PATH)/jpeg-9b/djpeg.c $(LOCAL_PATH)/jpeg-9b/example.c $(LOCAL_PATH)/jpeg-9b/jaricom.c $(LOCAL_PATH)/jpeg-9b/jcapimin.c $(LOCAL_PATH)/jpeg-9b/jcapistd.c $(LOCAL_PATH)/jpeg-9b/jcarith.c $(LOCAL_PATH)/jpeg-9b/jccoefct.c $(LOCAL_PATH)/jpeg-9b/jccolor.c $(LOCAL_PATH)/jpeg-9b/jcdctmgr.c $(LOCAL_PATH)/jpeg-9b/jchuff.c $(LOCAL_PATH)/jpeg-9b/jcinit.c $(LOCAL_PATH)/jpeg-9b/jcmainct.c $(LOCAL_PATH)/jpeg-9b/jcmarker.c $(LOCAL_PATH)/jpeg-9b/jcmaster.c $(LOCAL_PATH)/jpeg-9b/jcomapi.c $(LOCAL_PATH)/jpeg-9b/jcparam.c $(LOCAL_PATH)/jpeg-9b/jcprepct.c $(LOCAL_PATH)/jpeg-9b/jcsample.c $(LOCAL_PATH)/jpeg-9b/jctrans.c $(LOCAL_PATH)/jpeg-9b/jdapimin.c $(LOCAL_PATH)/jpeg-9b/jdapistd.c $(LOCAL_PATH)/jpeg-9b/jdarith.c $(LOCAL_PATH)/jpeg-9b/jdatadst.c $(LOCAL_PATH)/jpeg-9b/jdatasrc.c $(LOCAL_PATH)/jpeg-9b/jdcoefct.c $(LOCAL_PATH)/jpeg-9b/jdcolor.c $(LOCAL_PATH)/jpeg-9b/jddctmgr.c $(LOCAL_PATH)/jpeg-9b/jdhuff.c $(LOCAL_PATH)/jpeg-9b/jdinput.c $(LOCAL_PATH)/jpeg-9b/jdmainct.c $(LOCAL_PATH)/jpeg-9b/jdmarker.c $(LOCAL_PATH)/jpeg-9b/jdmaster.c $(LOCAL_PATH)/jpeg-9b/jdmerge.c $(LOCAL_PATH)/jpeg-9b/jdpostct.c $(LOCAL_PATH)/jpeg-9b/jdsample.c $(LOCAL_PATH)/jpeg-9b/jdtrans.c $(LOCAL_PATH)/jpeg-9b/jerror.c $(LOCAL_PATH)/jpeg-9b/jfdctflt.c $(LOCAL_PATH)/jpeg-9b/jfdctfst.c $(LOCAL_PATH)/jpeg-9b/jfdctint.c $(LOCAL_PATH)/jpeg-9b/jidctflt.c $(LOCAL_PATH)/jpeg-9b/jidctfst.c $(LOCAL_PATH)/jpeg-9b/jidctint.c $(LOCAL_PATH)/jpeg-9b/jmemansi.c $(LOCAL_PATH)/jpeg-9b/jmemdos.c $(LOCAL_PATH)/jpeg-9b/jmemmac.c $(LOCAL_PATH)/jpeg-9b/jmemmgr.c $(LOCAL_PATH)/jpeg-9b/jmemname.c $(LOCAL_PATH)/jpeg-9b/jmemnobs.c $(LOCAL_PATH)/jpeg-9b/jpegtran.c $(LOCAL_PATH)/jpeg-9b/jquant1.c $(LOCAL_PATH)/jpeg-9b/jquant2.c $(LOCAL_PATH)/jpeg-9b/jutils.c $(LOCAL_PATH)/jpeg-9b/rdbmp.c $(LOCAL_PATH)/jpeg-9b/rdcolmap.c $(LOCAL_PATH)/jpeg-9b/rdgif.c $(LOCAL_PATH)/jpeg-9b/rdjpgcom.c $(LOCAL_PATH)/jpeg-9b/rdppm.c $(LOCAL_PATH)/jpeg-9b/rdrle.c $(LOCAL_PATH)/jpeg-9b/rdswitch.c $(LOCAL_PATH)/jpeg-9b/rdtarga.c $(LOCAL_PATH)/jpeg-9b/transupp.c $(LOCAL_PATH)/jpeg-9b/wrbmp.c $(LOCAL_PATH)/jpeg-9b/wrgif.c $(LOCAL_PATH)/jpeg-9b/wrjpgcom.c $(LOCAL_PATH)/jpeg-9b/wrppm.c $(LOCAL_PATH)/jpeg-9b/wrrle.c $(LOCAL_PATH)/jpeg-9b/wrtarga.c
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 jmemnobs.c
#導出頭文件
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)\
                           $(LOCAL_PATH)/include/
#加入頭文件
#LOCAL_C_INCLUDES := $(LOCAL_PATH)/jpeg-9b/
include $(BUILD_SHARED_LIBRARY)

Application.mk


APP_ABI := all

APP_OPIM :=debug
APP_STL := stlport_static
APP_CPPFLAGS := -fexceptions -frtti #允許異常功能,及運行時類型識別
#APP_CPPFLAGS +=-std=c++11 #允許使用c++11的函數等功能
APP_CPPFLAGS +=-fpermissive  #此項有效時表示寬鬆的編譯形式,比如沒有用到的代碼中有錯誤也可以通過編譯;使用GNU STL時不用此項std::string 居然編譯不通過!!

3.png庫的編譯
由於該庫不是我編譯的,同事編譯的,直接給出編譯好的.so文件

後續補充吧。

發佈了28 篇原創文章 · 獲贊 29 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章