Giter Club home page Giter Club logo

androidopencvgradleplugin's Introduction

AndroidOpenCVGradlePlugin

Gradle Plugin that will automate retrieving the Android OpenCV SDK and linking it to the project, making it easy to include OpenCV into Android applications.

Usage

For usage in an Android Project, the below changes are needed:

  1. In the project build.gradle (at the root directory of the project folder), modify the repositories and dependencies block as below:

    buildscript {
        repositories {
            maven {  // At the beginning of the block
              url "https://plugins.gradle.org/m2/"
            }
            // ... google() or jcenter() or others
            maven { // At the end of the block and after google()
               url 'https://repo.gradle.org/gradle/libs-releases'
            }
        }
        dependencies {
            // ... the Android plugin and other classpath definitions
            classpath 'com.ahasbini.tools:android-opencv-gradle-plugin:0.1.+'
        }
    }
  2. In the app module (or application/library module that you're developing) build.gradle file, add the android-opencv-gradle-plugin plugin and the androidOpenCV as below:

    // apply plugin: 'com.android.application' or other Android plugin
    apply plugin: 'com.ahasbini.android-opencv-gradle-plugin' // After the Android plugin
    
    // ...
    
    android {
        // ...
    }
    
    androidOpenCV { // After the android block
    
        // Required: Version of OpenCV to be used in the project
        version '3.3.0'
    }
    
    // ...
  3. Optional: If the project did not contain any C++ code (usually located in jni or cpp folders under {project_app_module}/src/main/), perform the below changes:

    • Add the below in app module (or application/library module that you're developing) build.gradle file:

      android {
          // ...
          externalNativeBuild {
              cmake {
                  path "CMakeLists.txt"
              }
          }
      }
    • Create the CMakeLists.txt in app module (or application/library module that you're developing) directory and check the Android Guides for NDK or the sample for more info.

  4. Do a Gradle Sync , refresh linked C++ projects (Build > Refresh Linked C++ Projects) and compile to make sure the integration was successful.

Troubleshooting

In most cases the plugin will print out clear error messages to what might be wrong in the build. In case the error messages are cryptic or unsure if the plugin is causing it or not, two parameters for the build command could be leveraged for getting more info.

  • --debug flag, this will output more logging (lots of them) from gradle and any plugin used with the build including logs from AndroidOpenCVGradlePlugin. Example:

    # On Windows:
    gradlew.bat --debug <task>
    # or on *nix:
    ./gradlew --debug <task>
  • -PENABLE_ANDROID_OPENCV_LOGS project parameter flag, this is specific to the AndroidOpenCVGradlePlugin and it will print out its logs without enabling the logs for everything else in the build. Example:

    # On Windows:
    gradlew.bat -PENABLE_ANDROID_OPENCV_LOGS <task>
    # or on *nix:
    ./gradlew -PENABLE_ANDROID_OPENCV_LOGS <task>
  • Perform a clean. Example:

    # On Windows:
    gradlew.bat clean
    # or on *nix:
    ./gradlew clean

Underlying Logic & Implementation

TL;DR The plugin downloads the opencv-xxx-android-sdk.zip, extracts the files, compiles the Java sources into AARs, and links them along with JNI binaries into the project using dependencies and externalNativeBuild configurations.

In detail, below are the steps it carries out (primarily in this order):

  • AndroidOpenCVGradlePlugin.java (Configuration Phase)
    • Extract the requested version of OpenCV from the androidOpenCV block.
    • Set the OpenCV JNI directory and arguments of the externalNativeBuild in the android block.
    • Add flatDir repository with {user_home}/.androidopencv/{version}/build-cache/outputs path and add dependencies debugImplementation and releaseImplementation with the names of the AARs to project dependencies.
  • DownloadAndroidOpenCVTask.java (Execution Phase)
    • Download the opencv-xxx-android-sdk.zip into the directory {user_home}/.androidopencv/{version} using the url template "https://sourceforge.net/projects/opencvlibrary/files/" + version + "/opencv-" + version + "-android-sdk.zip".
  • UnZipAndroidOpenCVTask.java (Execution Phase)
    • Extract the downloaded zip file within the {user_home}/.androidopencv/{version} folder.
  • CopyAndroidOpenCVJniLibsTask.java (Execution Phase)
    • Copy the JNI libs/directories from the extracted zip folder into {project_module_directory}/build/androidopencv.
  • BuildAndroidOpenCVAarsTask.java (Execution Phase)
    • Compile AAR binaries from Java source and place outputs (debug and release builds) in {user_home}/.androidopencv/{version}/build-cache using the Gradle Tooling API.

Contributing & Future Plans

As this is still under development and testing, feel free to share your contributions to the project with finding issues, code improvements and/or feature additions and requests. The build scripts are configured and made ready for testing and publishing custom builds to the local machine for use in other projects. This can be done similar to to the below steps:

git clone https://github.com/ahasbini/AndroidOpenCVGradlePlugin.git
cd AndroidOpenCVGradlePlugin

# Perform some code changes and run some tests in your favorite IDE/Editor

# Publish custom builds on Windows:
gradlew.bat :plugin:publishToMavenLocal
# or on *nix:
./gradlew :plugin:publishToMavenLocal

Once commands above complete to succession, the plugin is now located in the local Maven repository of the machine (.m2) under com\ahasbini\tools\android-opencv-gradle-plugin.

With regards to the test cases, the current tests executed for the plugin can be found in the test folder which include various unit, integration and functional test cases. The tests also make use of the Gradle TestKit along with pre-defined build scripts or project setups found in the test resources folder to best simulate the use cases of the plugin from within the project itself.

As part of the ongoing development, below is a brief list of things (TODOs) that are in plan for the project:

  • Add Android NDK version checking and configuration for proper linking with compiled binaries of OpenCV
  • Add plugin clean tasks
  • Add plugin install of custom built Android OpenCV task
  • Add more tests and assertions in test cases
  • CI/CD integration

androidopencvgradleplugin's People

Contributors

ahasbini avatar mikrop avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

androidopencvgradleplugin's Issues

build errors about CleanAndroidOpenCVBuildFolderTask missing annotations

I followed the steps in the README to update my project build.gradle and app build.gradle

When I build on Ubuntu Linux with

./gradlew clean assembleDebug

I get the following errors about missing annotations in CleanAndroidOpenCVBuildFolderTask:

FAILURE: Build failed with an exception.

* What went wrong:
Some problems were found with the configuration of task ':passthrough:cleanAndroidOpenCVBuildFolder' (type 'CleanAndroidOpenCVBuildFolderTask').
  - In plugin 'com.ahasbini.android-opencv-gradle-plugin' type 'com.ahasbini.tools.androidopencv.task.CleanAndroidOpenCVBuildFolderTask' property 'description' is missing an input or output annotation.
    
    Reason: A property without annotation isn't considered during up-to-date checking.
    
    Possible solutions:
      1. Add an input or output annotation.
      2. Mark it as @Internal.
    
    Please refer to https://docs.gradle.org/7.4.2/userguide/validation_problems.html#missing_annotation for more details about this problem.
  - In plugin 'com.ahasbini.android-opencv-gradle-plugin' type 'com.ahasbini.tools.androidopencv.task.CleanAndroidOpenCVBuildFolderTask' property 'group' is missing an input or output annotation.
    
    Reason: A property without annotation isn't considered during up-to-date checking.
    
    Possible solutions:
      1. Add an input or output annotation.
      2. Mark it as @Internal.
    
    Please refer to https://docs.gradle.org/7.4.2/userguide/validation_problems.html#missing_annotation for more details about this problem.
  - In plugin 'com.ahasbini.android-opencv-gradle-plugin' type 'com.ahasbini.tools.androidopencv.task.CleanAndroidOpenCVBuildFolderTask' property 'name' is missing an input or output annotation.
    
    Reason: A property without annotation isn't considered during up-to-date checking.
    
    Possible solutions:
      1. Add an input or output annotation.
      2. Mark it as @Internal.
    
    Please refer to https://docs.gradle.org/7.4.2/userguide/validation_problems.html#missing_annotation for more details about this problem.

OpenCV sourceforge links incorrect?

Having setup the plugin as described, I get the following error when building the project:

ERROR: Not Found (HTTP status code: 404, URL: https://sourceforge.net/projects/opencvlibrary/files/3.4.3/opencv-3.4.3-android-sdk.zip)

As suggested by the error message the link that is being used does not seem to work.

The download link that is used when navigating manually via a browser is:

https://sourceforge.net/projects/opencvlibrary/files/opencv-android/3.4.3/opencv-3.4.3-android-sdk.zip/download

But that redirects to another site for the actual download, in my case:

https://cfhcable.dl.sourceforge.net/project/opencvlibrary/opencv-android/3.4.3/opencv-3.4.3-android-sdk.zip

still asking for OpenCV Manager

I tried your sample and when running it still asks for opencv manager.
Looking at the generated apk i see this
Screen Shot 2020-02-25 at 18 16 45
Though when running it checks for openv_info so lib which is not there:
Screen Shot 2020-02-25 at 18 18 45

Any idea?

PS: i am using opencv 4.1.1

Does not work!

I have followed the instructions and I always get this error:
ERROR: Failed to resolve: :opencv-debug:3.4.9

This is regardless of the OpenCV version I specify. I have tried with different ones.

I am using:
Android Studio 3.6.1
Gradle 3.6.1

Any help? Thanks.

Building fails

Following the directions and the build will fail because the sample project tried to access the plugin before it is place.

I fixed the issue by first commenting out the line 'include 'sample'" in the gradle.settings the first time that ./gradlew :plugin:publishToMavenLocal is run

EDIT: I thought that I fixed but it has now failed with a new error, I'll list it here even though it might be a different issue:

        Caused by java.lang.IllegalArgumentException: URI is not hierarchical```

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.