AndroidStudio无法找到OpenCV标头

时间:2016-06-10 07:48:45

标签: android opencv android-studio android-ndk opencv4android

我想尝试SDK附带的示例代码之一,即" tutorial-2-mixedprocessing"。我按照以下步骤操作:

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

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

3)警告:“当前插件中已弃用NDK集成”我点击了“Set" android.useDeprecatedNdk = true"在gradle.properties中继续使用当前的NDK集成“

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

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

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

8)构建 - > make project leads 错误:(2,33)opencv2 / core / core.hpp:没有这样的文件或目录

在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)

没有帮助。

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

我添加了' 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)找不到属性' cppFlags'在com.android.build.gradle.internal.dsl.NdkOptions_Decorated@797a42f2。

2 个答案:

答案 0 :(得分:1)

如果你想制作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文件夹导入file-> new->导入项目中的库。 希望,这段代码会有所帮助

干杯。

答案 1 :(得分:0)

在build.gradle中添加以下行

sourceSets.main {

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

buildTypes {       ...         }