我正在尝试在Android Studio中编写C ++文件,我想在我的项目中使用OpenCV。
但是,当我尝试使用以下内容时,我收到错误Cannot Find 'opencv2'
。
#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/features2d.hpp>
要在Android中设置OpenCV,您必须执行以下步骤found here,才能在Android Studio中使用OpenCV的Java部分。
据我所知,在Android Studio中使用OpenCV的C ++部分,您必须将Android.mk
和Application.mk
添加到包含您的本机代码的文件夹中。
我的Android.mk
文件如下所示。
LOCAL_PATH := $(call my-dir)
CVROOT := C:/Users/Dan/Documents/Repos/Android-Studio/Assets/opencv-3.4.1-android-sdk/OpenCV-android-sdk/sdk/native/jni
include $(CLEAR_VARS)
OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on
OPENCV_LIB_TYPE:=SHARED
include $(CVROOT)/OpenCV.mk
LOCAL_MODULE := app
LOCAL_SRC_FILES := native-lib.cpp
LOCAL_LDLIBS += -llog -ldl
include $(BUILD_SHARED_LIBRARY)
我的Application.mk
文件如下所示。
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi-v7a
APP_PLATFORM := android-27
我是否做错了将我的项目设置为在Android上使用OpenCV的C ++部分?
附加信息如果有所作为
我的项目大纲看起来像这样。
我的渐变看起来如下
app模块
apply plugin: 'com.android.application'
android {
compileSdkVersion 27
defaultConfig {
applicationId "com.test.test.esra"
minSdkVersion 24
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
cppFlags "-frtti -fexceptions"
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:27.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
// Room - Managing local databases
implementation 'android.arch.persistence.room:runtime:1.0.0'
annotationProcessor "android.arch.persistence.room:compiler:1.0.0"
//Jetbrains Annotations
implementation 'org.jetbrains:annotations-java5:15.0'
implementation project(':openCVLibrary341')
}
openCVLibrary341模块
apply plugin: 'com.android.library'
android {
compileSdkVersion 27
defaultConfig {
minSdkVersion 24
targetSdkVersion 27
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}
项目build.gradle
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
答案 0 :(得分:3)
对于那些到达这里并遇到同样问题的人来说,这个问题很容易解决。
您不再需要.mk
个文件,因此可以将其删除。
如果您从头开始创建项目,请确保已安装Android NDK和CMake,并为项目启用它们。
按照此answer中发布的初始步骤,在Android上设置OpenCV的Java部分。您需要更改app module's
构建gradle以反映下面的代码段。
defaultConfig {
...
externalNativeBuild {
cmake {
cppFlags "-frtti -fexceptions"
abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'mips', 'mips64'
}
}
}
sourceSets {
main {
jniLibs.srcDirs = ['src/main/jniLibs']
}
}
然后您要编辑文件CMakeLists.txt
。在此文件中,您希望在cmake_minimum_required(VERSION X.X.X)
行下面包含以下代码。
此外,您需要将lib_opencv
添加到target_link_libraries
底部附近的CMakeLists.txt
。这有助于防止未定义的引用错误。
include_directories(your-path-to/OpenCV-android-sdk/sdk/native/jni/include)
add_library( lib_opencv SHARED IMPORTED )
set_target_properties(lib_opencv PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libopencv_java3.so)
...
target_link_libraries( # Specifies the target library.
native-lib
# OpenCV lib
lib_opencv
# Links the target library to the log library
# included in the NDK.
${log-lib} )
请务必将your-path-to
替换为OpenCV for Android的实际路径。
最后,清理项目并刷新链接的C ++项目。这将删除错误。
我从这个非常好的GitHub page获得了这些信息。致领导者的信用
澄清您不再需要.mk
个文件。这适用于Android Studio 3.我没有在旧版本的Android Studio或Eclipse上测试过这个问题,因此这些IDE可能需要.mk
个文件。