我正在使用C ++的Android本机程序中使用openCV。
我的ndk-build版本是14,我正在使用Android Studio 3.3 RC3和OpenCV 4.0。
当我试图为相机添加一个简单的面部检测程序并尝试使用ndk-build构建它时,它给了我以下错误:
错误:对'cv :: CascadeClassifier :: load(std :: string const&)'的未定义引用
这是我的一些代码:
void *frameRetriever(void *p){
...
const std::string face_cascade_name = "/data/local/tmp/haarcascade_frontalface_alt.xml";
cv::CascadeClassifier face_cascade;
face_cascade.load(face_cascade_name);
...
}
我尝试使用
cv::CascadeClassifier face_cascade = cv::CascadeClassifier(face_cascade_name)
代替加载功能,甚至尝试
void loadCascade(std::string filepath){
cv::CascadeClassifier face_cascade;
if ( !face_cascade.load(filepath) ){
LOGE("--Error Loading face cascade\n");
}
}
这些仍然给了我关于ndk-build错误的未定义参考。
(face_cascade_name
中的文件对所有用户都是rwx)
我已经链接了Android.mk
文件中的所有库:
...
LOCAL_LDLIBS += -L$(OPENCV_ANDROID_SDK)/libs/armeabi-v7a/
LOCAL_LDLIBS += -lopencv_core
LOCAL_LDLIBS += -lopencv_calib3d
LOCAL_LDLIBS += -lopencv_imgproc
LOCAL_LDLIBS += -lopencv_objdetect
LOCAL_LDLIBS += -lopencv_features2d
LOCAL_LDLIBS += -lopencv_flann
LOCAL_LDLIBS += -lopencv_stitching
LOCAL_LDLIBS += -lopencv_video
LOCAL_LDLIBS += -lopencv_dnn
LOCAL_LDLIBS += -lopencv_highgui
LOCAL_LDLIBS += -lopencv_imgcodecs
LOCAL_LDLIBS += -lopencv_ml
LOCAL_LDLIBS += -lopencv_photo
LOCAL_LDLIBS += -lopencv_videoio
...
我确实将所有这些OpenCV库都保存为.so
下的<myProject>/app/src/main/libs/armeabi-v7a/
文件
对于构建OpenCV库,我使用以下bash脚本:
#!/bin/bash
if [ ! -d "./android_build/" ]; then
mkdir android_build
fi
if [ ! -d "./build/" ]; then
mkdir build
fi
rm -rf android_build/out/
cd build
cmake .. \
-DCMAKE_TOOLCHAIN_FILE=../platforms/android/android.toolchain.cmake \
-DCMAKE_BUILD=Release \
-DBUILD_DOCS=OFF \
-DBUILD_JAVA=OFF \
-DBUILD_ANDROID_EXAMPLES=OFF \
-DBUILD_ANDROID_PROJECTS=OFF \
-DBUILD_SHARED_LIBS=ON \
-DANDROID_NDK=${ANDROID_NDK} \
-DANDROID_NATIVE_API_LEVEL=android-19 \
-DANDROID_SDK_TARGET=19 \
-DANDROID_ABI="armeabi-v7a with NEON" \
-DANDROID_TOOLCHAIN=clang \
-DANDROID_STL=c++_shared \
-DCV_TRACE=OFF \
-DWITH_IPP=OFF \
-DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK}/build/cmake/android.toolchain.cmake \
-DBUILD_opencv_core=ON \
-DBUILD_opencv_imgproc=ON \
-DBUILD_opencv_calib3d=ON \
-DBUILD_opencv_imgcodecs=ON \
-DBUILD_opencv_dnn=ON \
-DBUILD_opencv_flann=ON \
-DBUILD_opencv_ml=ON \
-DBUILD_opencv_objdetect=ON \
-DBUILD_opencv_photo=ON \
-DBUILD_opencv_stiching=ON \
-DBUILD_opencv_videoio=ON \
-DBUILD_opencv_highgui=ON \
-DCMAKE_INSTALL_PREFIX:PATH=$(pwd)/../android_build/out \
-DWITH_CUDA=OFF \
-DWITH_TBB=OFF \
-DHAVE_OPENCL=ON \
-DOPENCL_FOUND=ON \
-DWITH_OPENCL=ON \
-DHAVE_OPENCL_STATIC=ON \
-DOPENCL_LIBRARY=$(pwd)/../libopencl-stub/libOpenCL.so \
-DOPENCL_INCLUDE_DIRS=$(pwd)/../libopencl-stub/include \
cmake -LA
make -j4
make install
在测试了几件事之后,我注意到其参数中带有“ const String &
”的其他OpenCV函数在 ndk-build 上也给我带来同样的错误。 (其他OpenCV功能(例如cvtColor则可以正常工作)。
任何帮助将不胜感激。
答案 0 :(得分:1)
显然,更改makefile中的某些值可以解决此问题。
在Application.mk中,更改APP_STL := gnustl_shared
到c ++ _ shared并注释掉NDK_TOOLCHAIN_VERSION。
在Android.mk中,注释掉一些LOCAL_CPPFLAG。
将其构建并解决了问题。