androidflutteropencv

Error when importing OpenCV module in Flutter


I want to integrate OpenCV into my Flutter application. I added File -> New Module -> OpenCV and followed various tutorials. However, I keep getting the following error:

A problem occurred evaluating project ':opencv'. Could not find method android() for arguments [build_d0fa9sjy98ud51wze3pr61mmb$_run_closure1@688fc404] on project ':opencv' of type org.gradle.api.Project.

I have researched many Stack Overflow posts, used AI tools, and read the documentation, but I couldn't find a solution.How can I fix this issue?

opencv/build.gradle file:

apply plugin: 'com.android.library'
apply plugin: 'maven-publish'
try {
    apply plugin: 'kotlin-android'
    println "Configure OpenCV with Kotlin"
} catch (Exception e) {
    println "Configure OpenCV without Kotlin"
}

def openCVersionName = "4.11.0"
def openCVersionCode = ((4 * 100 + 11) * 100 + 0) * 10 + 0

println "OpenCV: " +openCVersionName + " " + project.buildscript.sourceFile

android {
    namespace "org.opencv.androidsdk"
    compileSdkVersion 34

    defaultConfig {
        minSdkVersion 21
        targetSdkVersion 34

        versionCode openCVersionCode
        versionName openCVersionName

        externalNativeBuild {
            cmake {
                arguments "-DANDROID_STL=c++_shared"
                targets "opencv_jni_shared"
            }
        }
    }
    
    android {
        buildFeatures {
            buildConfig true
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
        targetCompatibility JavaVersion.VERSION_17
    }

    buildTypes {
        debug {
            packagingOptions {
                doNotStrip '**/*.so'  // controlled by OpenCV CMake scripts
            }
        }
        release {
            packagingOptions {
                doNotStrip '**/*.so'  // controlled by OpenCV CMake scripts
            }
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }

    sourceSets {
        main {
            jniLibs.srcDirs = ['native/libs']
            java.srcDirs = ['java/src']
            res.srcDirs = ['java/res']
            manifest.srcFile 'java/AndroidManifest.xml'
        }
    }

    externalNativeBuild {
        cmake {
            path (project.projectDir.toString() + '/libcxx_helper/CMakeLists.txt')
        }
    }
    
    buildFeatures {
        prefabPublishing true
        buildConfig true
    }

    prefab {
        opencv_jni_shared {
            headers 'native/jni/include'
        }
    }

    publishing {
        singleVariant('release') {
            withSourcesJar()
            withJavadocJar()
        }
    }

}

publishing {
    publications {
        release(MavenPublication) {
            groupId = 'org.opencv'
            artifactId = 'opencv'
            version = '4.11.0'

            afterEvaluate {
               from components.release
           }
        }
    }
    repositories {
        maven {
            name = 'myrepo'
            url = "${project.buildDir}/repo"
        }
    }
}

dependencies {
}

android/app/build.gradle:

plugins {
    id "com.android.application"
    id "kotlin-android"
    // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
    id "dev.flutter.flutter-gradle-plugin"
}

android {
    namespace = "com.example.adass"
    compileSdk = flutter.compileSdkVersion
    ndkVersion = flutter.ndkVersion

    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }

    kotlinOptions {
        jvmTarget = JavaVersion.VERSION_1_8
    }

    defaultConfig {

        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
        applicationId = "com.example.adass"
        // You can update the following values to match your application needs.
        // For more information, see: https://flutter.dev/to/review-gradle-config.
        minSdk = 24
        targetSdk = flutter.targetSdkVersion
        versionCode = flutter.versionCode
        versionName = flutter.versionName
    }

    buildTypes {
        release {
            // TODO: Add your own signing config for the release build.
            // Signing with the debug keys for now, so `flutter run --release` works.
            signingConfig = signingConfigs.debug
        }
    }
    externalNativeBuild {
        cmake {
            path "../CMakeLists.txt"
        }
    }

}

flutter {
    source = "../.."
}

android/settings.gradle file:


pluginManagement {
    def flutterSdkPath = {
        def properties = new Properties()
        file("local.properties").withInputStream { properties.load(it) }
        def flutterSdkPath = properties.getProperty("flutter.sdk")
        assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
        return flutterSdkPath
    }()

    includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")

    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
    }
}

plugins {
    id "dev.flutter.flutter-plugin-loader" version "1.0.0"
    id "com.android.application" version "8.3.2" apply false
    id "org.jetbrains.kotlin.android" version "1.8.22" apply false
}

include ":app"
include(":opencv")
project(":opencv").projectDir = File("C:\\dev\\opencv\\OpenCV-android-sdk\\sdk")


Solution

  • I found the problem. The issue was that the OpenCV folder path was incorrect. I wrote

    <#include <opencv2/opencv.hpp>

    but I should have written:

    #include <your_opencv_module_path>

    The error was simple, but it took me a long time to realize it. :(