本篇文章主要介绍如何用ndk编译opencv源码。这篇文章所介绍的步骤是在通过CMAKE配置了opencv源码后的基础上进行的。如果还没有经过vs配置opencv源码,请参照: 【opencv】如何配置修改并调试opencv源代码
我们的目标是通过ndk编译opencv源码,能够根据自己的需求修改编译对应的opencv库。整个过程重要的也就是写makefile文件进行编译而已。
1、配置环境
系统:win7
源码版本:opencv3.0.0
开发环境:eclipse juno with adt, android-ndk-r10b
由于opencv模块化做得比较好,这里以opencv_core为例讲解如何进行配置。
2、复制opencv_core源码
从安装的opencv源码中找到opencv_core模块,并复制到我们的安卓工程。具体位置在:opencv\sources\modules\core
将core文件夹下的src及include复制到安卓工程的jni文件夹下,如下图所示:
需要注意到的是,这里需要把hal文件夹也复制过来。而且,需要在整个opencv工程里面找到对应cvconfig.h,具体位置应该是在opencv\build\include\opencv2,并且复制过来,这个文件用于配置对应的编译选项。如:
/* OpenCV compiled as static or dynamic libs */
#define BUILD_SHARED_LIBS
#define __OPENCV_BUILD
/* Compile for 'real' NVIDIA GPU architectures */
//#define CUDA_ARCH_BIN ""
/* Create PTX or BIN for 1.0 compute capability */
/* #undef CUDA_ARCH_BIN_OR_PTX_10 */
/* NVIDIA GPU features are used */
//#define CUDA_ARCH_FEATURES ""
3、修改android.mk
这里我们修改jni下的android.mk文件,具体说明见注释:
LOCAL_PATH := $(call my-dir)
#opencv依赖于zlib库,该库在NDK中已经提供了,但要在include的时候加入
#进去,所以定义了ZLIB_PATH变量,将其指向zlib.h的位置,并在之后三个模
#块的编译中加入到include中。
ZLIB_PATH:= D:\Program Files\adt-bundle-windows-x86_64-20140702\android-ndk-r10b\platforms\android-19\arch-arm\usr
include $(CLEAR_VARS)
LOCAL_MODULE := myCamera
#定义include文件位置
LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/core/include \
$(LOCAL_PATH)/core/include \
$(ZLIB_PATH)/include
#编译opencv必须的编译标志,不加会提示exception等错误。如果是在工作
#中某个系统里(类ANDROID)中增加opencv的功能,但系统的编译选项中没
#开-frtti,则会在链接的时候报错。
LOCAL_CPPFLAGS := -frtti -fexceptions
LOCAL_LDLIBS += -llog -lz
#源文件,需要注意的是,这里需要把hal也
LOCAL_SRC_FILES := \
core/src/precomp.hpp \
core/src/algorithm.cpp \
core/src/alloc.cpp \
core/src/arithm.cpp \
core/src/array.cpp \
core/src/bufferpool.impl.hpp \
core/src/command_line_parser.cpp \
core/src/conjugate_gradient.cpp \
core/src/convert.cpp \
core/src/copy.cpp \
core/src/cuda_gpu_mat.cpp\
core/src/cuda_host_mem.cpp\
core/src/cuda_info.cpp\
core/src/cuda_stream.cpp\
core/src/datastructs.cpp \
core/src/downhill_simplex.cpp \
core/src/dxt.cpp \
core/src/glob.cpp \
core/src/kmeans.cpp \
core/src/lapack.cpp \
core/src/lda.cpp \
core/src/lpsolver.cpp \
core/src/mathfuncs.cpp \
core/src/matmul.cpp \
core/src/matop.cpp \
core/src/matrix.cpp \
core/src/ocl.cpp \
core/src/opencl_kernels_core.hpp \
core/src/opengl.cpp \
core/src/out.cpp \
core/src/parallel_pthreads.cpp \
core/src/pca.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 \
core/src/stl.cpp \
core/src/types.cpp \
core/src/umatrix.cpp \
hal/src/arithm.cpp \
hal/src/color.cpp \
hal/src/filter.cpp \
hal/src/mathfuncs.cpp \
hal/src/matrix.cpp \
hal/src/prepcomp.hpp \
hal/src/resize.cpp \
hal/src/stat.cpp \
hal/src/warp.cpp
#这里加上我们自己的C文件
LOCAL_SRC_FILES += image.cpp
LOCAL_LDLIBS+= -L$(SYSROOT)/usr/lib
include $(BUILD_SHARED_LIBRARY)
4、修改Appliccation.mk
APP_ABI := armeabi-v7a
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_PLATFORM := android-8
5、需要注意的问题:
如果在过程中遇到unreference的问题,大多是没有包含头文件或者函数定义没有找到,在opencv源码中查找对应的函数定义,然后复制到工程项目中即可。
这里可以下载我已经配置好的部分工程进行参考:工程项目
接下来就可以自己在opencv源码里