Android Studio 找不到 OpenCV headers

AndroidStudio can't find OpenCV headers

我想试试 SDK 附带的示例代码之一,即 "tutorial-2-mixedprocessing"。我遵循了这些步骤:

1)导入项目->选择教程目录

2) 我将其命名为“tutorial-2-mixedprocessing1”,勾选了 3 个选项(“尽可能替换 jars 和 lib 源”和“创建 Gradle-style 模块名称”)

3) 警告:“当前插件中不推荐使用 NDK 集成” 我点击了 “在 gradle.properties 中设置 "android.useDeprecatedNdk=true" 以继续使用当前的 NDK 集成”

4) 导入模块 -> 选择 java 模块,在我的例子中是“C:\SDKs\OpenCV-android-sdk\sdk\java” -> 勾选左 3 个复选框

5) 错误:原因:无法在以下位置找到哈希字符串 'android-14' 的目标:C:\Users\c010\AppData\Local\Android\Sdk 安装缺少的平台和同步项目。 我更改了 compileSdkversion、buildToolsVersion 和 targetSdkVersion 并进行了同步。错误消失了。

6-7) 打开模块设置-> 依赖添加Opencv 模块作为模块依赖。添加了 NDK 位置(在我的例子中是“C:\SDKs\android-ndk-r12-beta2”)

8) Build -> make project leads Error:(2, 33) opencv2/core/core.hpp: No such file or directory

在 Eclipse 中我会添加一些包含路径,但我不知道如何在 Android Studio 中添加。我认为编辑 Android.mk 会有帮助:

我的Android.mk是

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

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

LOCAL_MODULE    := mixed_sample
LOCAL_SRC_FILES := jni_part.cpp
LOCAL_LDLIBS +=  -llog -ldl

include $(BUILD_SHARED_LIBRARY)

我把它改成了纯绝对路径

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include C:\SDKs\OpenCV-android-sdk\sdk\native\jni\OpenCV.mk

LOCAL_MODULE    := mixed_sample
LOCAL_SRC_FILES := jni_part.cpp
LOCAL_LDLIBS +=  -llog -ldl

include $(BUILD_SHARED_LIBRARY)

没有帮助。

我在“ifdef ...”行之前添加了'OPENCV_ANDROID_SDK := C:\SDKs\OpenCV-android-sdk\',结果相同。

我加了'LOCAL_C_INCLUDES += C:\SDKs\OpenCV-android-sdk\sdk\native\jni\include',结果一样。

我编辑了 gradle 看起来像

的文件
apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        applicationId "org.opencv.samples.tutorial2"
        minSdkVersion 8
        targetSdkVersion 8

        ndk {
            moduleName "mixed_sample"
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
}

dependencies {
    compile project(':openCVLibrary310')
}

我把ndk支架改成如下:

ndk {
    moduleName "mixed_sample"
    cFlags  += "-I${file("C:/SDKs/OpenCV-android-sdk/sdk/native/jni/include")}".toString()
}

错误:错误:null-IC:\SDKs\OpenCV-android-sdk\sdk\native\jni\include:参数无效

它不接受 cppFlags 错误:(14, 0) 在 com.android.build.gradle.internal.dsl.NdkOptions_Decorated@797a42f2 上找不到 属性 'cppFlags'。

如果您想制作 NDK 模块,您需要将 gradle 更改为实验性。在 opencv gradle 文件和你的 gradle 文件中。

所以,首先更改您的 gradle 模块:

buildscript {
repositories {
    jcenter()
}
dependencies {
    classpath 'com.android.tools.build:gradle-experimental:0.4.0'

    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
   }
}

您的应用 build.gradle 应该是这样的。

apply plugin: 'com.android.model.application'

model {

android {
    compileSdkVersion = 23
    buildToolsVersion = "23.0.2"
    defaultConfig.with {
        applicationId = "your package name"
        minSdkVersion.apiLevel = 15
        targetSdkVersion.apiLevel = 23
        versionCode = 1
        versionName = "1.0"
    }

}
android.ndk {
    moduleName = "viulib_interface_jni"
    cppFlags.add("-fexceptions")
    cppFlags.add("-I" + file("src/main/jni").absolutePath)
    stl = "gnustl_shared" // Which STL library to use: gnustl or stlport
    ldLibs.addAll(["android", "EGL", "GLESv2", "dl", "log", "z"])
}

android.productFlavors {
    create("arm") {
        ndk.with{
            abiFilters.add("armeabi")

            File curDir = file('./')
            curDir = file(curDir.absolutePath)
            String libsDir = curDir.absolutePath + "/src/main/jniLibs/armeabi/"

        }
    }
    create("armv7") {
        ndk.with {
            abiFilters.add("armeabi-v7a")

            File curDir = file('./')
            curDir = file(curDir.absolutePath)
            String libsDir = curDir.absolutePath + "/src/main/jniLibs/armeabi-v7a/"
        }
    }
}


}

dependencies {
compile fileTree(include: ['*.jar', '*.so'], dir: 'libs')
compile 'com.android.support:appcompat-v7:23.2.1'
compile 'com.android.support:design:23.2.1'
compile project('openCVLibrary310')
}

我用的是gradle 0.4.0 experimetal,不过你也可以选择gradle 0.7.0,但在这种情况下,你需要看看gradle有什么变化0.7.0 语法。

我建议您开始创建 JNI 桥以使用 opencv c++ 函数,然后尝试为 opencv 库创建构建 gradle 文件。

不要忘记在文件->新建->导入项目中将opencv文件夹导入为库。 希望,这段代码会有所帮助

干杯。

在您的 build.gradle

中添加以下行

sourceSets.main {

    jni.srcDirs = [] //disable automatic ndk-build call
    jniLibs.srcDir 'src/main/jniLibs'
}

构建类型{ ... }