【问题标题】:AndroidStudio can't find OpenCV headersAndroidStudio 找不到 OpenCV 头文件
【发布时间】:2016-10-11 02:22:15
【问题描述】:

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

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

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

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

4) 导入模块 -> 在我的情况下,在“C:\SDKs\OpenCV-android-sdk\sdk\java”中选择的 java 模块 -> 勾选了左 3 复选框

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

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

8) Build -> make project lead 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”。

【问题讨论】:

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


    【解决方案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文件夹作为库导入。 希望这段代码会有所帮助

    干杯。

    【讨论】:

    • 您有一个名为“libsDir”的字符串。它在哪里使用?在您的帮助和here 的教程的帮助下,它可以编译,但现在我看到了一些链接器错误(例如“未定义的对 `cv::FastFeatureDetector::create(int, bool, int)' 的引用”)。
    • libsDir 是一个目录路径,其中包含要链接的 3rdparty 库。如果不需要使用。您的链接问题出现是因为在 gradle 文件中您没有链接 opnecv c++ .so 文件。这个问题比较广泛和困难。你可以试试这个链接,stackoverflow.com/questions/34701003/…,还没有解决,但可能你会有更多的想法。
    【解决方案2】:

    在你的 build.gradle 中添加以下行

    sourceSets.main {

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

    构建类型 { ... }

    【讨论】:

      猜你喜欢
      • 2012-03-28
      • 1970-01-01
      • 1970-01-01
      • 2015-05-26
      • 1970-01-01
      • 2015-02-09
      • 2015-12-09
      • 1970-01-01
      • 2012-08-27
      相关资源
      最近更新 更多