error: undefined reference to 'cv::CascadeClassifier::detectMultiScale

开发配置环境:

ndk :r19_x86_x64

opencv sdk :v3.4.3

android studio 3.2

遇到问题:

在调试Android Studio的Jni通过Ndk编译opencv时遇到问题:

error: undefined reference to 'cv::CascadeClassifier::detectMultiScale

error: undefined reference to 'cv::CascadeClassifier::detectMultiScale_第1张图片

jni代码:

extern "C"  JNIEXPORT jlong JNICALL
Java_com_test_MainActivity_detectFaces(JNIEnv *env, jobject instance, jlong addrInputRgbaImage) {
    cv::Mat& imageInput = *(cv::Mat*)addrInputRgbaImage;
    cv::Mat imageGray;
    cv::cvtColor(imageInput,imageGray,cv::COLOR_RGBA2GRAY);
    auto width = imageInput.size().width;
    auto height = imageInput.size().height;
    if(faceDetecter != nullptr){
        std::vector faces;
        faceDetecter->detectMultiScale( imageGray, faces, 1.1, 2, 
            0|cv::CASCADE_SCALE_IMAGE, cv::Size(width/10, height/5));
        for(auto faceRect: faces){
            cv::rectangle(imageInput,faceRect,cv::Scalar(255,0,0),3);
        }
    }
    return 0;
}

主要问题在 faceDetecter->detectMultiScale(... ...)

解决方法:

app的build.gradle文件中添加标准 gnustl_static(ndk-r16版本支持) ,而不是c++_static(ndk新版本)

    defaultConfig {
        ... ...
        externalNativeBuild {
            cmake {
                cppFlags "-std=c++11 -frtti -fexceptions"
                arguments '-DANDROID_STL=gnustl_static'
            }
        }
    }

这时由于我的ndk是r19版本:

error: undefined reference to 'cv::CascadeClassifier::detectMultiScale_第2张图片

所以报错如下:

CMake Error: CMAKE_C_COMPILER not set, after EnableLanguage

CMake Error: CMAKE_CXX_COMPILER not set, after EnableLanguage

-- Configuring incomplete, errors occurred!

这时候我们需要把ndk更新为r16版本即可解决,

https://dl.google.com/android/repository/android-ndk-r16-windows-x86.zip

https://dl.google.com/android/repository/android-ndk-r16-windows-x86_64.zip
下载r16 ,并解压你的sdk目录,通过选择File->project structure...->SDK Location 更改ndk目录:

error: undefined reference to 'cv::CascadeClassifier::detectMultiScale_第3张图片

总结分析:

不能确定是否为ndk向下支持问题,应该是ndk和opencv版本匹配问题,目前还没有找到高版本ndk调用opencv方法,但是如果你感兴趣的话可以尝试下,最新版本的opencv和ndk的匹配是否存在问题。

你可能感兴趣的:(Android,APP,Activity,opencv,error,undefined,reference)