首页 > 解决方案 > Android,opencv - 尝试初始化 Mat 时未找到 long org.opencv.core.Mat.n_Mat() 的实现

问题描述

我想使用 OpenCV 做一些事情,我正在尝试创建Mat对象:

import org.opencv.core.CvType;
import org.opencv.core.Mat;
...
Mat imageMat = new Mat(CvType.CV_8U);

在这一行我得到错误:

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)

我在我的 android 项目中将 OpenCV 作为单独的模块,并通过implementation project(path: ':OpenCV')在部分中添加它的 build.gradle将其导入到我的主模块中dependencies

我见过一个类似的问题,但使用我不想在我的项目中使用的OpenCvManager来回答它。如果我做对了,我的用户将被迫在使用我的应用程序之前单独安装此管理器,对吗?真恶心。

更新 1

我已经添加

static {
        Log.d(TAG, "OPENCV INITIALIZATION " + (OpenCVLoader.initDebug() ? "SUCCEEDED" : "FAILED"));
    }

在我的MainActivity.java. 它打印“SUCCEEDED”,但错误并没有消失。然而,它改变了:

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)

更新 2

UPD 1 中的糟糕错误是由于new Mat(). 没有 args 就没有错误。调查仍在继续。

标签: javaandroidopencvgradledependencies

解决方案


建议使用 CMake 链接 SDK 而不是复制编译好的文件。

您可以在 android > defaultConfig > externalNativeBuild > cmake 下的应用程序 build.gradle 中添加 OpenCV_DIR cmake 参数

arguments "-DOpenCV_DIR=" + file('../sdk').absolutePath + "/native/jni",
        "-DANDROID_TOOLCHAIN=clang",
        "-DANDROID_STL=c++_shared"

然后使用 find_package 在 CMake 中安装 OpenCV

set(ANDROID_OPENCV_COMPONENTS "opencv_java" CACHE STRING "")
message(STATUS "ANDROID_ABI=${ANDROID_ABI}")
find_package(OpenCV REQUIRED COMPONENTS ${ANDROID_OPENCV_COMPONENTS})

以下是详细程序:

https://kcwong-joe.medium.com/how-to-import-opencv-4-5-2-in-android-studio-d9114179628f


推荐阅读