1,下载OpenCV的,Android的SDK:HTTPS://opencv.org/opencv-3-4-1.html
- apk:OpenCV Manager apk的存放目录(根据不同cpu型号有不同的apk请根据自己的机器cpu型号来应,一般v7a的就好了)。
- samples:OpenCV的代码案例里面包括了人脸检测和其他。
- SDK:包括了SDK和LIB包。
2,导入测试工程
使用Android Studio直接导入samples\face-detection中人脸检测用例工程
导入后修改OpeCV Library和主工程face-detection的build.gradle配置如下
3,配置NDK
新版Android Studio用于构建原生库的默认工具是CMake。如果直接在local.properties中添加ndk路径进行编译将会出现以下错误
Error: Your project contains C++ files but it is not using a supported native build system
由于很多现有项目都使用构建工具包编译其原生代码,Android Studio还支持ndk-build。如果想要将现有的ndk-build库导入到的Android Studio项目中:
首先在工程目录下的gradle.properties文件的末尾加上一句
Android.useDeprecatedNdk = true
然后再在module的build.gradle(Module:app)的buildTypes上面添加sourceSets属性
sourceSets {
main {
jni.srcDirs = []
}
}
通过以上步骤配置工程将可编译正常并运行,接下来就是设置编译.so文件了
修改JNI下的Android.mk
#OPENCV_INSTALL_MODULES:=off
#OPENCV_LIB_TYPE:=SHARED
ifdef OPENCV_ANDROID_SDK
ifneq ("","$(wildcard $(OPENCV_ANDROID_SDK)/OpenCV.mk)")
include ${OPENCV_ANDROID_SDK}/OpenCV.mk
else
include ${OPENCV_ANDROID_SDK}/sdk/native/jni/OpenCV.mk
endif
else
include ../../sdk/native/jni/OpenCV.mk
endif
1:注意前面的“#”号,是注释的意思,删除即可。
2:注意这里有2个if else的判断,里面包含的是opencvsdk中的OpenCV.mk文件,这个修改成自己的opencv-sdk路径;如果mk路径错误在jni编译的时候会报错的;仔细看下错误会说明是OpenCV.mk路径找不到。
修改后如下
OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on
OPENCV_LIB_TYPE:=SHARED
include D:\OpenCV-android-sdk\sdk\native\jni\OpenCV.mk
OPENCV_CAMERA_MODULES、OPENCV_INSTALL_MODULES和OPENCV_LIB_TYPE这三个参数的作用分别是:
OPENCV_CAMERA_MODULES:为on时,会自动将带camera的so拷贝至工程下的libs目录下面;
OPENCV_INSTALL_MODULES:为on时,自动将依赖的OpenCV的so库拷贝到工程下的libs目录下面,但是只对OPENCV_CAMERA_MODULES有效;
OPENCV_LIB_TYPE:链接库的方式,分为静态和动态两种,静态时为STATIC,动态时为SHARED,常用的是动态链接库的方式;
4,编译动态库
Android Studio打开终端窗口cd进入工程main目录底下,输入命令ndk-build就可以进行编译(前提NDK需要添加到环境变量中),编译完后生成如下.so文件
E:\Android Project\OpenCV\app\src\main>ndk-build
如果需要编译多个CPU的架构动态连接库
JNI中有或创建Application.mk文件,则在该文件添加如下内容:
APP_ABI:= armeabi armeabi-v7a x86
JNI中没有或不想使用Application.mk文件,则在ndk-build参数中添加
E:\Android Project\OpenCV\app\src\main>ndk-build APP_ABI=“armeabi armeabi-v7a x86 mips”
5、导入静态库
将sdk\native\staticlibs目录下的文件复制到主工程项目下的jniLibs底下,没jniLibs则自行创建
6、导入so动态连接库
将编译生成的libdetection_based_tracker.so和libopencv_java3.so复制到jniLibs对应的CPU架构目录下,这样我们的项目就不需要安装OpenCV Manager apk也可运行了。