为 Android 编译 Native C/C++ 库
本文介绍了为 Android 操作系统交叉编译 C/C++ 库的方法
引言
本文介绍了为使用 Android 操作系统的移动设备编译 C/C++ 库的方法。
安装和代码编译
在继续之前,请确保已在 Eclipse 中安装并配置了以下所有软件组件
- Eclipse IDE
- Android SDK
- Eclipse -> Window -> Preferences -> Android -> 设置 SDK 路径
- Android NDK
- Eclipse -> Window -> Preferences -> Android -> NDK -> 设置 NDK 路径
- Eclipse 的 ADT 和 NDK 插件
- 从 Eclipse 更新站点安装 Android SDK + NDK 插件 https://dl-ssl.google.com/android/eclipse/
- 用于 C/C++ 支持的 Eclipse CDT
- 从 Eclipse 更新站点安装 CDT http://download.eclipse.org/tools/cdt/releases/indigo。
在桌面计算机上开发代码,并检查是否能够正确编译且没有错误。
本示例包含包含以下类的文件
- UniStrokeGestureRecognizer
- UniStrokeGesture
- GesturePoint
库 libOpenVision.so 已在 Ubuntu OS 上成功编译,现在我们继续交叉编译该库,用于基于 ARM 的使用 Android OS 的移动设备。
交叉编译
最简单的方法是使用 Eclipse IDE。Eclipse IDE 提供了将 native C/C++ 支持添加到现有 Android 项目的功能。
项目名称是 AndroidGesture。右键单击 Android 项目,然后
选择 Android Tools -> Add native support。
并输入所需的库名称为 OpenVision
这将为 native 构建配置 AndroidProject。创建一个包含 *OpenVision.cpp* 文件和关联的 *Android.mk* make 文件的 jni 文件夹
将所有 C/C++ 项目文件复制到 jni 文件夹中,然后继续修改 Android.mk 文件以配置 native 构建。
在 jni 目录中创建一个名为 OpenVision 的目录
将以下所有文件复制到 ImageApp 子目录中
- UniStrokeGestureRecognizer.cpp
- UniStrokeGestureRecognizer.hpp
- UniStrokeGesture.cpp
- UniStrokeGesture.hpp
- GesturePoint.cpp
- GesturePoint.hpp
将文件 OpenCVCommon.hpp 复制到 Common 子目录中
预设代码使用 OpenCV 库。将附加的 OpenCV 预编译库复制到 libs/armeabi 和 libs/armeabi2 目录中。
MakeFiles
下面是 Android.mk 文件的内容。此文件类似于包含 include 路径、源文件、库依赖项等的标准 make 文件。一些语法是 Android 构建特有的,并在注释中提供了解释
Android.mk 文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# name of the library to be built
LOCAL_MODULE := OpenVision
#list of source files to be build as part of the library
LOCAL_SRC_FILES := ImgApp/GesturePoint.cpp ImgApp/UniStrokeGesture.cpp ImgApp/UniStrokeGestureRecognizer.cpp
# list of dependent 3rd party or external libraries are included in the LOCAL_SHARED_LIBRARY variable
LOCAL_SHARED_LIBRARIES := $(foreach module,$(OPENCV_LIBS3),opencv_$(module))
OPENCV_MODULES3:=core imgproc flann contrib features2d video highgui legacy ml objdetect
OPENCV_LIBS3:=$(OPENCV_MODULES3)
# list of dependent system libraries
LOCAL_LDLIBS += -fPIC -llog -ldl -lm -lz -lm -lc -lgcc -Wl,-rpath,'libs/armeabi-v7a'
LOCAL_LDLIBS += -L$(LOCAL_PATH)/../libs/armeabi -llog -Llibs/armeabi-v7a/
# include path for header files for C and C++ applications
LOCAL_C_INCLUDES +=/usr/local/include /usr/local/include/opencv2 /home/pi19404/repository/OpenVision/OpenVision
LOCAL_CPP_INCLUDES +=/usr/local/include /usr/local/include/opencv2 /home/pi19404/repository/OpenVision/OpenVision
#The compilation flags for C/C++ applications
LOCAL_CPPFLAGS += -DHAVE_NEON -fPIC -DANDROID -I/usr/local/include/opencv -I/usr/local/include -I/OpenVision -I/home/pi19404/repository/OpenVision/OpenVision -fPIC
LOCAL_CFLAGS += -DHAVE_NEON -fPIC -DANDROID -I/usr/local/include/opencv -I/usr/local/include -I/OpenVision -I/home/pi19404/repository/OpenVision/OpenVision -fPIC
LOCAL_CPP_FEATURES += exceptions
#statement specifies build of a shared library
include $(BUILD_SHARED_LIBRARY)
#files in the libs/armeabi are deleted during each build
#we need to have 3rd party opencv libraries in this directory
#the files are placed in the armeabi2 directory
#when ever a native build is trigged the opencv library files specified in the OPENCV_MODULES2
#variable are copied from the armeabi2 directory to the armeabi or armeabi-v7a directory
#as per the specification of APP_ABI in the Application.mk file
include $(CLEAR_VARS)
OPENCV_MODULES2:= calib3d contrib core features2d flann highgui imgproc legacy ml nonfree objdetect photo stitching video videostab
OPENCV_LIBS2:=$(OPENCV_MODULES2)
OPENCV_LIB_SUFFIX:=so
OPENCV_LIB_TYPE:=SHARED
define add_opencv_module1
include $(CLEAR_VARS)
LOCAL_PATH := libs/armeabi2
LOCAL_MODULE:=aaaopencv_$1
LOCAL_SRC_FILES:=libopencv_$1.$(OPENCV_LIB_SUFFIX)
include $(PREBUILT_$(OPENCV_LIB_TYPE)_LIBRARY)
endef
$(foreach module,$(OPENCV_LIBS2),$(eval $(call add_opencv_module1,$(module))))
Application.mk make 文件
APP_ABI := armeabi-v7a armeabi APP_STL := gnustl_static APP_PLATFORM := android-8 APP_CPPFLAGS := -frtti -fexceptions -ftree-vectorize -mfpu=neon -O3 -mfloat-abi=softfp -ffast-math
构建项目后,libOpenVision.so 文件可以在 libs/armeabi 和 libs/armeabi-v7a 目录中找到。 这些已被交叉编译,可在基于 Android 的设备上使用。
现在可以使用 JNI 接口从 java 应用程序加载和调用它们
文件
Android 的预编译 opencv 库可以在 www.github.com/pi19404/OpenCVAndroid 找到
上面使用的源文件和 make 文件可以在 OpenVision 存储库 www.github.com/pi19404/OpenVision 中找到
Android.mk 和 Application.mk 文件以及 jni 目录的内容可以在下面找到