工作需要,在android上使用opencv。opencv当前的版本(2.4.8)已经有了opencv4android,但是一方面这个SDK将所有opencv的功能打到了一个so包里,所以so的体积较大,从而造成使用该so的apk也大,上层对此不太满意;另一方面,使用opencv4android必须在手机上安装openv manager,上层对此也感觉有点别扭。所以我尝试用opencv的源码自己编译应用于android平台的opencv动态库以供底层开发用。首先介绍一下相关环境:
opencv: opencv2.4.8 (linux)
系统:ubuntu12.04
开发环境:eclipse juno(with CDT等), android ndk r9c
针对android开发可用的so库需要用ndk build编译,我详细查看了下opencv.org上的文档,上面只有opencv在linux,win等上的编译方法,当然还有opencv4android的使用方法。网上的文档找到一个使用老版本opencv来自己编译的帖子,但版本较老就没采用,所以只能自己分析下opencv的源码写mk文件进行编译。
为了压缩动态库的体积,也根据自己的实际需求,暂时只编译了三个库:core,imgproc,highgui. 幸运的是,新版本的opencv模块化比较好,所以不存在太多源码拆分的问题。所以,将源码中module文件夹下的三个模块源码放到jni/opencv目录下就可以了。之后在opencv文件夹下编写Android.mk文件,如下:
LOCAL_PATH:= $(call my-dir)
ZLIB_PATH:= /home/yxh/eclipse/android-ndk-r9c/platforms/android-14/arch-arm/usr
#opencv_core module
include $(CLEAR_VARS)
LOCAL_MODULE := libopencv_core
LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/core/include \
$(ZLIB_PATH)/include
LOCAL_CPPFLAGS := -frtti -fexceptions
LOCAL_LDLIBS += -llog -lz
LOCAL_SRC_FILES := \
core/src/precomp.cpp \
core/src/algorithm.cpp \
core/src/alloc.cpp \
core/src/arithm.cpp \
core/src/array.cpp \
core/src/cmdparser.cpp \
core/src/convert.cpp \
core/src/copy.cpp \
core/src/datastructs.cpp \
core/src/drawing.cpp \
core/src/dxt.cpp \
core/src/gpumat.cpp \
core/src/lapack.cpp \
core/src/mathfuncs.cpp \
core/src/matmul.cpp \
core/src/matop.cpp \
core/src/matrix.cpp \
core/src/opengl_interop_deprecated.cpp \
core/src/opengl_interop.cpp \
core/src/persistence.cpp \
core/src/parallel.cpp \
core/src/rand.cpp \
core/src/stat.cpp \
core/src/system.cpp \
core/src/tables.cpp
include $(BUILD_SHARED_LIBRARY)
#opencv_imgproc module