Android工程NDK编译导入OpenCV4.6.0静态库bug记录和解决方法

目录

简介

编译问题

【1】静态库链接顺序

【2】找不到gz文件

运行问题

【1】找不到openmp链接

【2】找不到glob_rec


简介

        Android使用NDK编译C++代码时,开发过程中需要导入OpenCV,使用OpenCV库提供的函数。此时,需要链接OpenCV的动态库(.so)链接或者采用静态库(.a)进行编译,本文目的是总结笔者在实践链接OpenCV的静态库进行编译时,碰到的一些编译问题和编译通过后,实际运行中碰到的问题。

编译问题

【1】静态库链接顺序

编译错误信息:

        undefined reference to __kmpc_for_static_fini'

        undefined reference to __itt_thread_set_name_ptr__3_0'

        undefined reference to cv::cvtColor(cv::_InputArray const&, cv::_OutputArray const&, int, int)'

解决方案:

        需要把所有opencv 和opencv的第三方库都加进来, 由于链接是用顺序的,依赖库放在后面,如opencv_highgui依赖 opencv_imgproc 依赖opencv_core,被依赖库 opencv_core放在最后。

${OPENCV_PATH}/${ANDROID_ABI}/libopencv_highgui.a
${OPENCV_PATH}/${ANDROID_ABI}/libopencv_imgcodecs.a
${OPENCV_PATH}/${ANDROID_ABI}/libopencv_imgproc.a
${OPENCV_PATH}/${ANDROID_ABI}/libopencv_core.a

【2】找不到gz文件

编译错误信息:

        undefined reference to `gzopen' 'gzwrite' and 'gzclose'

解决方案:

        编译时,加入标志符

-lz

运行问题

【1】找不到openmp链接

运行错误信息:

        android app 启动报错:java.lang.UnsatisfiedLinkError: dlopen failed: library “libomp.so“ not found

解决方案:

        编译时,加入标志符

-fopenmp -static-openmp

【2】找不到glob_rec

运行错误信息:

        Error: Requested object was not found (could not open directory: /data/app/com.example.demo-2/base.apk!/lib/armeabi-v7a) in glob_rec

解决方案:

        在通过源码编译OpenCV(.a)的库时,加入标志符

-D OPENCV_DISABLE_FILESYSTEM_SUPPORT=ON

你可能感兴趣的:(bug)