之前我们搭建了 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 即可:
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:
然后将 OpenCVEngineInterface
文件拷贝到刚刚创建的 AIDL Folder 下,并创建为相同路径名称:
同时也需要在 /opencv/build.gradle
中开启 AIDL 配置:
android {
...
buildFeatures {
aidl true
}
}
在 /gradle.properties
中配置:
android.defaults.buildfeatures.buildconfig=true
再次运行,OpenCVEngineInterface
能够被正常识别。
Android OpenCV 基本配置已完成。