Android Studio与OpenCV for Android NDK,未找到OpenCV头文件。

3

我正在使用Android Studio进行Android OpenCV开发,但是当我编译在Eclipse中正常的项目时,出现了以下错误:

D:\software\AndroidStudioProjects\CameraMe\openCVSamplefacedetection\src\main\jni\DetectionBasedTracker_jni.cpp:2:33: fatal error: opencv2/core/core.hpp: No such file or directory

我猜想opencv的头文件没有找到,但我不知道问题出在哪里。

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

#OPENCV_CAMERA_MODULES:=off
#OPENCV_INSTALL_MODULES:=off
#OPENCV_LIB_TYPE:=SHARED
include D:\eclipse\OpenCV_2.4.9_android_sdk\sdk\native\jni\OpenCV.mk

LOCAL_SRC_FILES  := DetectionBasedTracker_jni.cpp
LOCAL_C_INCLUDES += $(LOCAL_PATH)
LOCAL_LDLIBS     += -llog -ldl

LOCAL_MODULE     := detection_based_tracker

include $(BUILD_SHARED_LIBRARY)

Application.mk

APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi-v7a
APP_PLATFORM := android-8

DetectionBasedTracker_jni.cpp

#include <DetectionBasedTracker_jni.h>
#include <opencv2/core/core.hpp>
#include <opencv2/contrib/detection_based_tracker.hpp>
......
1个回答

10

由于您使用的是Android Studio,因此默认情况下会忽略您的Makefiles,并且会动态生成新的Makefiles,但不会正确地引用OpenCV,因为它不受支持。

这是当前从Android Studio进行NDK构建的方式,但已经过时了,有更好的方法正在开发中。

您可以通过在build.gradle文件中进行以下操作来停用内置的NDK支持并改用您的Makefiles:

import org.apache.tools.ant.taskdefs.condition.Os

apply plugin: 'com.android.application'

android {
    ...

    sourceSets.main {
        jniLibs.srcDir 'src/main/libs' //set .so files directory to libs
        jni.srcDirs = [] //disable automatic ndk-build call
    }

    // call regular ndk-build(.cmd) script from app directory
    task ndkBuild(type: Exec) {
        if (Os.isFamily(Os.FAMILY_WINDOWS)) {
            commandLine 'ndk-build.cmd', '-C', file('src/main').absolutePath
        } else {
            commandLine 'ndk-build', '-C', file('src/main').absolutePath
        }
    }

    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn ndkBuild
    }
}

顺便提一下,我看到你只将APP_ABI设置为armeabi-v7a,但OpenCV还支持x86mips,因此你也可以轻松地扩展支持这些平台。


@ph0b,你能帮我吗?我正在尝试实现人脸检测,但在jni中遇到了许多错误。我不知道该如何修复它们。 - LuminiousAndroid
感谢您的建议,但是当我这样做时,Android Studio中的jniLibs和jni会被下划线标记,并显示错误“无法解析符号jniLibs”。我希望我能够发布我的整个应用程序build.gradle文件,但是在这些响应评论框中没有足够的空间。我应该在“答案”中发布更多详细信息吗?有什么建议吗? - cdahms
我在另一篇帖子中发布了更详细的内容和一些附带的截图,尝试了这个修复方法,但并没有解决问题。该帖子链接如下: http://stackoverflow.com/questions/38416566/android-studio-opencv-c-jni-ndk-unable-to-configure 如果有任何已经解决此问题的人能够快速查看一下,那将不胜感激。 - cdahms
它几乎完成了gradle-experimental,现在有一种新的、新的方法正在使用cmake进行开发:http://tools.android.com/tech-docs/new-build-system/gradle-experimental/migrate-to-stable - ph0b
我已经尝试了这个,但是出现了“在任务中找不到属性'Os'”的错误提示,似乎Gradle无法识别“Os”,你有什么建议吗? - Hugo
@ph0b:我有一个类似的问题,但是我使用本地C++支持构建了我的项目,那么你能建议我如何在我的cpp文件中添加“#include <opencv2/core.hpp>”文件吗? - Pratik Vyas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接