I want to do some things using OpenCV and I'm trying to create Mat
object:
import org.opencv.core.CvType;
import org.opencv.core.Mat;
...
Mat imageMat = new Mat(CvType.CV_8U);
On this line I get the error:
2021-04-28 15:13:44.657 23613-23613/xxxx.yyyy E/art: 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__)
2021-04-28 15:13:44.676 23613-23613/xxxx.yyyy D/AndroidRuntime: Shutting down VM
2021-04-28 15:13:44.686 23613-23613/xxxx.yyyy E/AndroidRuntime: FATAL EXCEPTION: main
Process: xxxx.yyyy, PID: 23613
java.lang.UnsatisfiedLinkError: 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:26)
at org.opencv.core.MatOfPoint2f.<init>(MatOfPoint2f.java:12)
at xxxx.yyyy.Utils.quadrilateralToRect(Utils.java:77)
at xxxx.yyyy.activities.CropActivity$1.onClick(CropActivity.java:74)
at android.view.View.performClick(View.java:5619)
at android.view.View$PerformClick.run(View.java:22298)
at android.os.Handler.handleCallback(Handler.java:754)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:165)
at android.app.ActivityThread.main(ActivityThread.java:6375)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:802)
I have OpenCV as separate module in my android project and have imported it into my main module by adding implementation project(path: ':OpenCV')
in its build.gradle in dependencies
section.
I have seen one simillar question but it is answered with using OpenCvManager which I wouldn't like to use in my project. If I'm getting right, my users will be forced to install this manager separately before using my app, right? It is disgousting.
UPD 1
I've added
static {
Log.d(TAG, "OPENCV INITIALIZATION " + (OpenCVLoader.initDebug() ? "SUCCEEDED" : "FAILED"));
}
in my MainActivity.java
. It prints "SUCCEEDED" but the error hasn't gone. However, it changed:
2021-04-28 21:09:47.798 22656-22656/xxxx.yyyy E/AndroidRuntime: FATAL EXCEPTION: main
Process: xxxx.yyyy, PID: 22656
java.lang.UnsupportedOperationException: Native object address is NULL
at org.opencv.core.Mat.<init>(Mat.java:14)
at xxxx.yyyy.Utils.quadrilateralToRect(Utils.java:94)
at xxxx.yyyy.activities.CropActivity$1.onClick(CropActivity.java:74)
at android.view.View.performClick(View.java:5619)
at android.view.View$PerformClick.run(View.java:22298)
at android.os.Handler.handleCallback(Handler.java:754)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:165)
at android.app.ActivityThread.main(ActivityThread.java:6375)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:802)
UPD 2
Oops error in UPD 1 was because of argument in new Mat()
. With no args there is no errors yet. Investigation continues.
Seems like I have found the solution (worked for OpenCV 3). It was needed to copy folder sdk\native\libs
from downloaded SDK into the project's root and name it jniLibs
. Each of its forders has single file named libopencv_java3.so
, as follows:
Also, probably, it is useful to add this code to your main activity:
static {
if (OpenCVLoader.initDebug()) {
Log.d(TAG, "OPENCV INITIALIZATION SUCCEEDED");
} else {
Log.d(TAG, "OPENCV INITIALIZATION FAILED BUT TRYING TO RELOAD");
System.loadLibrary("opencv_java3");
}
}
Bad side: these files add 80 Mb to your APK after build. Better solutions are welcome.