🔰

OpenCV + AndroidStudio + Kotlin (2023/09)

2023/09/28に公開

バージョン

  • OpenCV 4.8.0 android
  • Android Studio Giraffe | 2022.3.1 Patch 1
  • Gradle 8

手順(準備)

  1. OpenCV zip を解凍する
  2. OpenCV の sdk/build.gradle を編集する
sdk/build.gradle
apply plugin: 'com.android.library'
apply plugin: 'org.jetbrains.kotlin.android' // 変更

android {
    defaultConfig {
        compileSdkVersion 26 // Import後に修正
        namespace 'org.opencv' // 追加
    
        buildFeatures { // 追加
            buildConfig true
            aidl true
        }
  1. Android Studio で新規プロジェクトを作成しておく

手順(OpenCV の Import)

  1. プロジェクトの build.gradle.kts(Project: X) を編集する
build.gradle.kts
plugins {
    id("com.android.application") version "8.1.1" apply false
    id("com.android.library") version "8.1.1" apply false // 追加
    id("org.jetbrains.kotlin.android") version "1.8.10" apply false
  1. Android Studio のメニュー File -> New: -> Import Module...
  2. "Import module from source" で OpenCVsdk フォルダを指定する。Module name は ":opencv" とする
  1. Import で作成された settings.gradle をファイルごと削除する
settings.gradle
include ':opencv' // Import 時に作成されるファイルを削除する
  1. settings.gradle.kts(Project Settings) を編集する
settings.gradle.kts
include(":app", ":opencv") // 変更
  1. Gradle の (Sync | Try Again) でエラー無く build されるか確認
  2. Android Studio のメニュー File -> Project Structure...
  3. Dependencies を選択し、 app に対して Module Dependencyopencv を追加する
build.gradle.kts
dependencies {
    implementation(project(mapOf("path" to ":opencv"))) // 追加される
  1. build.gradle(Module :opencv) を編集する
build.gradle(Module_opencv)
android {
    // 各 SDK バージョンを app 側と合わせる
    compileSdkVersion 33
    namespace 'org.opencv'
    defaultConfig {
        minSdkVersion 30
        targetSdkVersion 33
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
        targetCompatibility JavaVersion.VERSION_17
    }
  1. 動作を確認
MainActivity.kt
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    // OpenCV実装を呼び出す際に No Implementation 例外が送出されることを防ぐ
    OpenCVLoader.initDebug();

    // OpenCV のバージョンが出力される
    Log.d("Test", OpenCVLoader.OPENCV_VERSION); 

(参考) 作業中に発生するエラー

Import 直後に出るエラー

Build file 'D:\Users\user1\AndroidStudioProjects\App1\build.gradle.kts' line: 2

Plugin [id: 'com.android.application', version: '8.1.1', apply: false] was not found in any of the following sources:

* Exception is:
org.gradle.api.plugins.UnknownPluginException: Plugin [id: 'com.android.application', version: '8.1.1', apply: false] was not found in any of the following sources:

OpenCV の build.gradle を修正しないと出るエラー

OpenCV の build.gradle に "namespace" が定義されていないエラー
Namespace not specified. Please specify a namespace in the module's build.gradle file like so:

android {
    namespace 'com.example.namespace'
}
app と opencv のSDKバージョンが合っていない?
jvm target compatibility should be set to the same Java version.
  Consider using JVM toolchain: https://kotl.in/gradle/jvm/toolchain...
クラスを解決できないエラー
mEngineService = OpenCVEngineInterface.Stub.asInterface(service);
import org.opencv.BuildConfig;

onCreate で initDebug しないと出るエラー

FATAL EXCEPTION: pool-2-thread-1
Process: com.example.chipviewer7, PID: 21140
java.lang.UnsatisfiedLinkError: No implementation found for long org.opencv.core.Mat.n_Mat(int, int, int) (tried Java_org_opencv_core_Mat_n_1Mat and Java_org_opencv_core_Mat_n_1Mat__III)

Discussion