開發配置環境:
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
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<cv::Rect> 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版本:
所以報錯如下:
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目錄:
總結分析:
不能確定是否爲ndk向下支持問題,應該是ndk和opencv版本匹配問題,目前還沒有找到高版本ndk調用opencv方法,但是如果你感興趣的話可以嘗試下,最新版本的opencv和ndk的匹配是否存在問題。