65.9K
CodeProject 正在变化。 阅读更多。
Home

为 Android 编译 Native C/C++ 库

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2014 年 8 月 20 日

CPOL

2分钟阅读

viewsIcon

24657

downloadIcon

244

本文介绍了为 Android 操作系统交叉编译 C/C++ 库的方法

引言

本文介绍了为使用 Android 操作系统的移动设备编译 C/C++ 库的方法。

安装和代码编译

在继续之前,请确保已在 Eclipse 中安装并配置了以下所有软件组件

  • Eclipse IDE

在桌面计算机上开发代码,并检查是否能够正确编译且没有错误。

本示例包含包含以下类的文件

  • 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 目录的内容可以在下面找到

© . All rights reserved.