You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

问题分析与修复方案

核心原因

  1. AOSP与独立NDK编译环境差异:独立NDK编译时OPENCV_INSTALL_MODULES := on会自动处理预编译静态库的路径,但AOSP构建系统会严格校验依赖库的存在性,且不会自动识别第三方SDK的库路径。
  2. ABI配置不统一:编译脚本指定的是aarch64-linux-android(arm64-v8a),但配置文件中设置的是armeabi-v7a,可能导致预编译库ABI不匹配。
  3. 依赖库未显式声明:OpenCV的features2d、dnn等静态库未被AOSP构建系统识别,需要显式指定依赖。

修复步骤

  1. 统一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。
  2. 显式声明依赖库
    在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
    
  3. 适配AOSP构建规则

    • 在Android.mk开头添加LOCAL_MODULE_TAGS := platform(系统应用标记)或optional,确保AOSP能识别该模块。
    • 若将OpenCV作为AOSP外部模块引入,需将OpenCV目录放到AOSP的external下,编写对应的Android.mk/Android.bp,而非直接引用本地SDK路径。
  4. 禁用不必要模块
    若二维码读取不需要dnn模块,可在Android.mk中添加OPENCV_MODULES := core imgproc imgcodecs features2d,只保留所需模块,减少依赖。

内容的提问来源于stack exchange,提问作者Netanel Hadad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 06:01:27