在Android Studio中找不到opencv2

时间:2018-03-12 20:40:38

标签: android c++ opencv makefile android-gradle

我正在尝试在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.mkApplication.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 ++部分?

附加信息如果有所作为

我的项目大纲看起来像这样。

enter image description here

我的渐变看起来如下

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
}

1 个答案:

答案 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个文件。