No implementation found for long org.opencv.core.Mat.n_Mat() error Using OpenCV

AndroidOpencv

Android Problem Overview


I am using OpenCV for adaptiveThreshold. My code for image processing using OpenCV is like this:

imageMat=new Mat();
Utils.bitmapToMat(bmp, imageMat);
Imgproc.cvtColor(imageMat, imageMat, Imgproc.COLOR_BGR2GRAY);
Imgproc.GaussianBlur(imageMat, imageMat, new Size(3, 3), 0);
Imgproc.adaptiveThreshold(imageMat, imageMat, 255,Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY_INV, 5, 4);

But I am getting an error while declaring Mat:

No implementation found for long org.opencv.core.Mat.n_Mat() (tried Java_org_opencv_core_Mat_n_1Mat and Java_org_opencv_core_Mat_n_1Mat__)
        at org.opencv.core.Mat.n_Mat(Native Method)
        at org.opencv.core.Mat.<init>(Mat.java:24)
        at com.example.pial_pc.instantbookreview.ImageCapture$3.onPictureTaken(ImageCapture.java:105)

As I'm new to OpenCV, I am not clearly understanding the error. The entire Java class where this code belongs is here.

What should I do to eliminate the error?

Android Solutions


Solution 1 - Android

I have successfully eliminate the error and my app does not crash while executing this line imageMat=new Mat();

The reason for the error is that Android calls the "onCreate" method before loading the OpenCV4Android library.So i have used Async Initialization of OpenCV using OpenCVManager. I have created BaseLoaderCallback before onCreate method. And inside that i have declared new Mat() like this:

private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
    @Override
    public void onManagerConnected(int status) {
        switch (status) {
            case LoaderCallbackInterface.SUCCESS:
            {
                Log.i("OpenCV", "OpenCV loaded successfully");
                imageMat=new Mat();
            } break;
            default:
            {
                super.onManagerConnected(status);
            } break;
        }
    }
};

Then in onResume() i have checked if OpenCV library have been loaded and initialized from within current application package or not. The codes are as follows:

public void onResume()
{
    super.onResume();
    if (!OpenCVLoader.initDebug()) {
        Log.d("OpenCV", "Internal OpenCV library not found. Using OpenCV Manager for initialization");
        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback);
    } else {
        Log.d("OpenCV", "OpenCV library found inside package. Using it!");
        mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
    }
}

And my error is gone. My full updated java class is here.

Reference links :

  1. Async Initialization of OpenCV on Android using OpenCVManager
  2. Tutorial1Activity.java

Solution 2 - Android

Initialize openCV library in your activity add this code before onCreate() method

static {
    if (!OpenCVLoader.initDebug()) {
        // Handle initialization error
    }
}

add this lib in your project : https://github.com/hschott/Camdroid

Solution 3 - Android

I put this line on onCreate method and make sure openCvManager is installed. This worked fine for me.

OpenCVLoader.initDebug();

Solution 4 - Android

Maybe you are forgetting to include the openCV library.

Include

static { 
     System.loadLibrary("opencv_java");
}

for OpenCV version 3 you should instead add:

static { 
     System.loadLibrary("opencv_java3");
}

Good Luck :)

Solution 5 - Android

Use this to resolve error.

public class MainActivity : Activity
    {

        Mat m;
        Mat grayM;
        ImageView imageView;
        public MainActivity()
        {
            if (!OpenCVLoader.InitDebug())
            {
                System.Console.WriteLine("GG");
            }

        }
}

Solution 6 - Android

This worked for me:

Make sure when linking the module dependency copy the file in native/libs opencv to a jniLibs directory in your project then set the following in your build.gradle(app) the build.

    sourceSets {
        main {
            jni {
                srcDirs 'src/main/jni', 'src/main/jniLibs'
            }
        }
    }

After that add this to your main activity

OpenCVLoader.initDebug()

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionPial KantiView Question on Stackoverflow
Solution 1 - AndroidPial KantiView Answer on Stackoverflow
Solution 2 - Androiduser7176550View Answer on Stackoverflow
Solution 3 - AndroidRikad Fauzi AlawiView Answer on Stackoverflow
Solution 4 - AndroidSiddharth BhathejaView Answer on Stackoverflow
Solution 5 - AndroidP A GosaiView Answer on Stackoverflow
Solution 6 - AndroidkongkipView Answer on Stackoverflow