基于OpenCV的二维码读取应用AOSP编译时缺失静态库报错
问题:OpenCV二维码应用在AOSP编译中缺失依赖库报错
背景
我开发了一款基于OpenCV的二维码读取应用,使用NDK单独编译时一切正常,编译脚本如下:
NDK=/opt/android-ndk-r23c export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64 export TARGET=aarch64-linux-android export API=21 export AR=$TOOLCHAIN/bin/llvm-ar export CC=$TOOLCHAIN/bin/$TARGET$API-clang export AS=$CC export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++ export LD=$TOOLCHAIN/bin/ld export RANLIB=$TOOLCHAIN/bin/llvm-ranlib export STRIP=$TOOLCHAIN/bin/llvm-strip $NDK/ndk-build
但将其作为系统应用加入AOSP编译流程时,出现以下报错:
read_qr/jni/../../OpenCV-android-sdk/sdk/native/jni/OpenCV.mk: error: "read_qr (EXECUTABLES android-arm) missing opencv_features2d (STATIC_LIBRARIES android-arm)" You can set ALLOW_MISSING_DEPENDENCIES=true in your environment if this is intentional, but that may defer real problems until later in the build. read_qr/jni/../../OpenCV-android-sdk/sdk/native/jni/OpenCV.mk: error: "read_qr (EXECUTABLES android-arm) missing opencv_dnn (STATIC_LIBRARIES android-arm)" You can set ALLOW_MISSING_DEPENDENCIES=true in your environment if this is intentional, but that may defer real problems until later in the build. build/make/core/main.mk:1118: error: exiting from previous errors. 22:44:58 ckati failed with: exit status 1
配置文件
Android.mk
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # Location of SDK on my drive OPENCVROOT := ${LOCAL_PATH}/../../OpenCV-android-sdk OPENCV_CAMERA_MODULES := off OPENCV_INSTALL_MODULES := on OPENCV_LIB_TYPE := STATIC TARGET_ARCH_ABI := armeabi-v7a include ${OPENCVROOT}/sdk/native/jni/OpenCV.mk # Load your local .cpp and .h files here. LOCAL_SRC_FILES := readQr.cpp LOCAL_LDLIBS := -lm -llog -ldl -lz LOCAL_CPPFLAGS += -fexceptions -frtti -std=c++17 LOCAL_LDFLAGS += -ljnigraphics LOCAL_C_INCLUDES += ${OPENCVROOT}/sdk/native/jni/include \ ${OPENCVROOT}/sdk/native/jni/include/opencv2 LOCAL_EXPORT_C_INCLUDES += ${OPENCVROOT}/sdk/native/jni/include \ ${OPENCVROOT}/sdk/native/jni/include/opencv2 LOCAL_MODULE := read_qr include $(BUILD_EXECUTABLE) APP_PLATFORM := android-21
Application.mk
APP_STL := c++_static APP_CPPFLAGS += -fexceptions -frtti -std=c++11 -D__STDC_CONSTANT_MACROS APP_ABI := armeabi-v7a APP_PLATFORM := android-21
问题分析与修复方案
核心原因
- AOSP与独立NDK编译环境差异:独立NDK编译时
OPENCV_INSTALL_MODULES := on会自动处理预编译静态库的路径,但AOSP构建系统会严格校验依赖库的存在性,且不会自动识别第三方SDK的库路径。 - ABI配置不统一:编译脚本指定的是
aarch64-linux-android(arm64-v8a),但配置文件中设置的是armeabi-v7a,可能导致预编译库ABI不匹配。 - 依赖库未显式声明:OpenCV的
features2d、dnn等静态库未被AOSP构建系统识别,需要显式指定依赖。
修复步骤
统一ABI配置
- 将编译脚本中的
TARGET改为armv7a-linux-androideabi,保持与配置文件的armeabi-v7a一致;若需要arm64架构,则同步修改所有配置为arm64-v8a。 - 检查
OpenCV-android-sdk/sdk/native/libs/armeabi-v7a目录下是否存在libopencv_features2d.a、libopencv_dnn.a等所需静态库,若缺失需下载对应ABI的OpenCV SDK。
- 将编译脚本中的
显式声明依赖库
在Android.mk中include ${OPENCVROOT}/sdk/native/jni/OpenCV.mk之后,添加静态库依赖:LOCAL_STATIC_LIBRARIES += opencv_core opencv_imgproc opencv_imgcodecs opencv_features2d opencv_dnn若OpenCV.mk未自动导入模块路径,可手动添加库链接:
LOCAL_LDFLAGS += -L${OPENCVROOT}/sdk/native/libs/armeabi-v7a \ -lopencv_core -lopencv_imgproc -lopencv_imgcodecs -lopencv_features2d -lopencv_dnn适配AOSP构建规则
- 在Android.mk开头添加
LOCAL_MODULE_TAGS := platform(系统应用标记)或optional,确保AOSP能识别该模块。 - 若将OpenCV作为AOSP外部模块引入,需将OpenCV目录放到AOSP的
external下,编写对应的Android.mk/Android.bp,而非直接引用本地SDK路径。
- 在Android.mk开头添加
禁用不必要模块
若二维码读取不需要dnn模块,可在Android.mk中添加OPENCV_MODULES := core imgproc imgcodecs features2d,只保留所需模块,减少依赖。
内容的提问来源于stack exchange,提问作者Netanel Hadad
相关产品推荐
相关产品推荐

