首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android,opencv -在尝试初始化Mat时没有为long org.opencv.core.Mat.n_Mat()找到任何实现

Android,opencv -在尝试初始化Mat时没有为long org.opencv.core.Mat.n_Mat()找到任何实现
EN

Stack Overflow用户
提问于 2021-04-28 12:44:54
回答 2查看 335关注 0票数 1

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

代码语言:javascript
运行
复制
import org.opencv.core.CvType;
import org.opencv.core.Mat;
...
Mat imageMat = new Mat(CvType.CV_8U);

在这一行中,我得到了错误:

代码语言:javascript
运行
复制
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部分将其导入到我的主模块中。

我见过一个simillar问题,但它是用OpenCvManager回答的,我不想在我的项目中使用它。如果我说对了,我的用户将被迫在使用我的应用程序之前分别安装这个管理器,对吗?这是令人沮丧的。

UPD 1

我增加了

代码语言:javascript
运行
复制
static {
        Log.d(TAG, "OPENCV INITIALIZATION " + (OpenCVLoader.initDebug() ? "SUCCEEDED" : "FAILED"));
    }

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

代码语言:javascript
运行
复制
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

UPD 1中的Oops错误是由于new Mat()中的争论引起的。在没有args的情况下,还没有错误。调查仍在进行。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-28 20:02:18

似乎我找到了解决方案(为OpenCV 3工作)。需要将下载的SDK中的文件夹sdk\native\libs复制到项目的根目录中,并将其命名为jniLibs。每个forders都有一个名为libopencv_java3.so的文件,如下所示:

此外,可能将此代码添加到您的主要活动中是有用的:

代码语言:javascript
运行
复制
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");
    }
}

坏的一面:这些文件在构建后添加80 Mb到您的APK。我们欢迎更好的解决办法。

票数 1
EN

Stack Overflow用户

发布于 2021-04-29 03:43:01

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

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

代码语言:javascript
运行
复制
arguments "-DOpenCV_DIR=" + file('../sdk').absolutePath + "/native/jni",
        "-DANDROID_TOOLCHAIN=clang",
        "-DANDROID_STL=c++_shared"

然后使用find_package在CMake中安装OpenCV

代码语言:javascript
运行
复制
set(ANDROID_OPENCV_COMPONENTS "opencv_java" CACHE STRING "")
message(STATUS "ANDROID_ABI=${ANDROID_ABI}")
find_package(OpenCV REQUIRED COMPONENTS ${ANDROID_OPENCV_COMPONENTS})
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67300498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档