之前我们搭建了 NDK 的项目环境,NDK 为我们打开了另一个世界,OpenCV 便是这新世界的领域之一,OpenCV 相关的资料介绍你可以在网上搜索到,这里就不赘述了,今天来讲讲 OpenCV 的环境配置。

OpenCV 的 Android SDK 以 Module 形式提供,但其目录结构与我们常见的 Android Module 略有差异,所以也给我们的配置带来一定门槛。我个人感觉是历史遗留问题,因此本文的配置教程在后续版本中不一定适用。

本文所用到的工具版本:

  • Android Studio Hedgehog | 2023.1.1
  • OpenCV 4.8.1
  • Java 17

OpenCV Android SDK 可以从官网或者其项目 Github Release 下载,NDK 环境虽然在 OpenCV 的后续开发中有着至关重要的作用,但与本文暂不关联,可自行决定是否配置。

下载到的 OpenCV Android SDK 目录如下:

OpenCV-android-sdk
  ├── LICENSE
  ├── README.android
  ├── samples
  └── sdk
   ├── build.gradle
   ├── etc
   ├── java
   ├── libcxx_helper
   └── native

我们将 /sdk 目录导入为 Module 即可:

Import OpenCV as Module

Gradle 会自动同步,如无意外,同步失败。

打开 /opencv/build.gradle 我们可以看到维护者为我们写了一大堆注释介绍如何导入,但并不完整,不然我也不需要特意写个笔记来记录。

我们将该 Module 的 targetSdkVersion 与主项目一致,并添加 namespace,同时取消 kotlin-android 这个 Plugin 的引入,相关修改如下:

apply plugin: 'com.android.library'
// apply plugin: 'kotlin-android'   // 修改 ①:取消引入

android {

    namespace "org.opencv"  // 修改 ②:添加 namespace
    
    compileSdkVersion 34    // 修改 ③:修改为和主项目一致

    defaultConfig {
        minSdkVersion 21
        targetSdkVersion 34 // 修改 ④:修改为和主项目一致
        ...
    }
    ...
}

项目初始化时我选择了 Kotlin DSL 作为构建配置语言,所以它会初始化一个 /settings.gradle.kts 文件,但是 OpenCV Android SDK 仍旧采用老的 Groovy DSL,所以导入时 Android Studio 又会另外增加一个 /settings.gradle 文件,其实这是没有必要的,我们将 /settings.gradle 文件删除,并在 /settings.gradle.kts 文件末尾将该 Module 引入即可:

pluginManagement {
    ...
}
dependencyResolutionManagement {
    ...
}

rootProject.name = "OpenCV"
include(":app")
include(":opencv")  // 添加导入的 OpenCV Module

这样导入 OpenCV Module 的操作就完成了,可以正常编译运行。

接下来将其添加到宿主依赖,在 /app/build.gradle.kts 中添加:

dependencies {
    ...
    implementation(project(":opencv"))
}

接下来会发现 OpenCVEngineInterface 这个接口被其他类导入时报错为不存在,因为它实际上是一个 AIDL 接口,所以我们需要为其创建专门的 AIDL Folder:

创建 AIDL Folder

然后将 OpenCVEngineInterface 文件拷贝到刚刚创建的 AIDL Folder 下,并创建为相同路径名称:

OpenCVEngineInterface AIDL 文件位置

同时也需要在 /opencv/build.gradle 中开启 AIDL 配置:

android {
    ...
    buildFeatures {
        aidl true
    }
}

/gradle.properties 中配置:

android.defaults.buildfeatures.buildconfig=true

再次运行,OpenCVEngineInterface 能够被正常识别。

Android OpenCV 基本配置已完成。