1.创建过程: 使用Android Studio创建工程,为了了解使用AS使用CMake集成OpenCV的必要步骤,在创建工程的时候就没有勾选Include C++ SuportOpenCV,在AndroidManifest文件中配置相机权限:
<uses-permission android:name="android.permission.CAMERA"/> <uses-feature android:name="android.hardware.camera" android:required="false"/> <uses-feature android:name="android.hardware.camera.autofocus" android:required="false"/> <uses-feature android:name="android.hardware.camera.front" android:required="false"/> <uses-feature android:name="android.hardware.camera.front.autofocus" android:required="false"/>
2.切换到Project模式,在app目录下添加CMakeLists.txt文件,具体配置内容在后面具体解释。
3.在src的同级目录创建libs文件夹,拷贝OpenCV编译后的适配各种CPU架构的so文件(包括头文件)到到libs目录
4.创建javah扩展命令:选择file--Settings,在弹出的Settings界面选择Tools--External Tools,在右侧的点击+,在弹出的子界面配置javah命令参数,配置参数如下:
Program:$JDKPath$/bin/javah.exe
Parameters:-classpath . -jni -d $ModuleFileDir$/src/main/jni $FileClass$
Working directory:$ModuleFileDir$\src\main\java
创建完成后就会在右键菜单中添加External Tools---javah工具
5.创建jni目录:把OpenCV提供的demo中的java文件拷贝到Java下的命名空间内(和Activity同一目录),并选择拷贝的文件右键选择External Tools---javah,就会在jni目录下生成相应头文件,并拷贝demo中的cpp文件到jni文件夹下,修改对应的头文件为生成的命,并修改cpp中相应的方法名称和.h文件中的一致。添加完成后的工程目录结构如下图:
OpenCV,z
6.工程支持CMake:打开app下的build.gradle,在defaultConfig节点内部添加externalNativeBuild配置节,在buildTypes
后添加CMake编译,并配置依赖库的目录(第三步创建的目录),具体配置如下:
defaultConfig {
applicationId "com.mm.www.ndkdemo"
minSdkVersion 19
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
cppFlags ""
}
}
ndk{
abiFilters 'arm64-v8a','armeabi-v7a'
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
sourceSets{
main{
jniLibs.srcDirs = ["./libs"]
}
}
7.配置CMakeLists:打开CMakeLists.txt文件,添加CMake版本:
cmake_minimum_required(VERSION 3.4.1)
# set()用来设置一个路径全局变量 distribution_DIR
set(distribution_DIR ${CMAKE_SOURCE_DIR}/libs)
add_library( # Sets the name of the library.
native-lib
SHARED
src/main/jni/native-lib.cpp
src/main/jni/DetectionBasedTracker_jni.cpp)
# 创建一个动态库 opencv_java3 直接引用opencv_java3.so
add_library(opencv_java3 SHARED IMPORTED )
set_target_properties(opencv_java3 PROPERTIES IMPORTED_LOCATION ${distribution_DIR}/${ANDROID_ABI}/libopencv_java3.so)
# Specifies a path to native header files.
include_directories(./libs/include/)
find_library(
log-lib
log )
target_link_libraries( # Specifies the target library.
native-lib
# Links the target library to the log library
# included in the NDK.
opencv_java3
${log-lib})