在Android Studio中对开发环境进行配置
软件版本
Android Studio 3.5.2
android-ndk-r20b
opencv-3.2.0-android-sdk
新建工程
工程类型选择Native C++,C++ Standard选择 C++11
新建完工程目录
导入依赖lib
在Main目录下新建jniLibs文件夹,并将 opencv-3.2.0-android-sdk\OpenCV-android-sdk\sdk\native\libs 文件夹下的包复制到 jniLibs中
修改CMakeLists.txt文件
# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html
# Sets the minimum version of CMake required to build the native library.
set(pathToOpenCv F:/opencv-3.2.0-android-sdk/OpenCV-android-sdk)#设置OpenCv的路径变量
#支持-std=gnu++11
set(CMAKE_VERBOSE_MAKEFILE on)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
#配置加载native依赖
include_directories(${pathToOpenCv}/sdk/native/jni/include)
set(CURRENT_DIR ${CMAKE_SOURCE_DIR})
# 在Gradle Console输出信息
# CMAKE_SOURCE_DIR:
message("CURRENT_DIR:" ${CMAKE_SOURCE_DIR})
add_library(lib_opencv STATIC IMPORTED ) #表示创建一个导入库,静态方式
# 设置工程的App路径
set(pathToProject H:/Project/OpenCvAndroid/app)
set(libs ${pathToProject}/src/main/jniLibs)
set_target_properties(lib_opencv
PROPERTIES
IMPORTED_LOCATION ${libs}/${ANDROID_ABI}/libopencv_java3.so
)
include_directories(${pathToProject}/src/main/cpp/includes)
cmake_minimum_required(VERSION 3.4.1)
add_library( # Sets the name of the library.
native-lib
SHARED
native-lib.cpp)
find_library(
log-lib
log)
target_link_libraries(
native-lib
${log-lib} android -ljnigraphics lib_opencv)
修改Module中的build.gradle,添加sourceSets
sourceSets {
main {
jniLibs.srcDirs = ['H:\\Project\\OpenCvAndroid\\app\\src\\main\\jniLibs']
}
}
在native-lib.cpp中添加include
#include <iostream>
#include <sstream>
#include <string>
#include <stdlib.h>
#include <cstdio>
#include <stdio.h>
#include <cstdlib>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/ml/ml.hpp>
正常编译则表示OpenCv引入成功
问题:
问题一:
在使用OpenCv2.4时报出错误,这是因为OpenCV引用了GNU的东西。
fatal error: 'ext/atomicity.h' file not found
#include <ext/atomicity.h>
^~~~~~~~~~~~~~~~~
1 error generated.
ninja: build stopped: subcommand failed.
需要在Module中的build.gradle的cmake中添加 arguments "-DANDROID_STL=gnustl_static"
而NDK18之后不支持DANDROID_STL
参数,需要将NDK版本修改为17及17以下
externalNativeBuild {
cmake {
cppFlags "-std=c++11"
arguments "-DANDROID_STL=gnustl_static"
}
}
问题二:
Error while executing process =\ninja.exe with arguments {-C .cxx\cmake\debug\arm64-v8a native-lib}
ninja: Entering directory `=\.cxx\cmake\debug\arm64-v8a'
ninja: error: '==/libopencv_java3.so', needed by 'cmake/debug/obj/arm64-v8a/libnative-lib.so', missing and no known rule to make it
需要在CmakeLists.txt文件中添加绝对路径
set(pathToProject H:/Project/MyApplication/app)
set(libs ${pathToProject}/src/main/jniLibs)
set_target_properties(lib_opencv
PROPERTIES
IMPORTED_LOCATION ${libs}/${ANDROID_ABI}/libopencv_java.so
)
在build.gradle中添加sourceset
sourceSets {
main {
jniLibs.srcDirs = ['H:\\Project\\MyApplication\\app\\src\\main\\jniLibs']
}
}