在Android Java应用程序中使用OpenCV Mat.OpenCV Mat出现NoClassDefFound错误

Use OpenCV Mat in Android Java Application. NoClassDefFound Error with OpenCV Mat

本文关键字:Mat OpenCV 出现 NoClassDefFound 错误 Android Java 应用程序      更新时间:2023-10-16

我正在用java开发一个Android应用程序,它调用本地c库中的一个函数。本机函数需要一个指向Opencv-Mat类型的指针,因此我需要能够在我的Java应用程序中创建一个Opencv-Mat类型以传递给本机库。

我使用的是安卓工作室,我已经将"opencv库".jar文件添加到了我项目的libs文件夹中。因此,我可以导入所需的Opencv模块,并创建一个Opencv-Mat类型/访问其函数。问题是在运行时我得到以下错误:

java.lang.NoClassDefFoundError: org.opencv.core.Mat

我读到Opencv.jar文件只是一个围绕本机功能的包装器,应用程序需要"本机库"。如何查找/添加此项?我需要向我的项目添加什么,以便应用程序可以在运行时找到Opencv-Mat类定义?我只想使用OpenCV Mat类型,而不想使用其他类型。

我读过关于设置OpenCV Android的教程,但这些教程需要在Android设备上安装OpenCV Manager应用程序,但这对我来说可能是个问题,因为我无法访问将安装我的应用程序的设备,而且OpenCV Manager应用程序也不会安装在这些设备上。相反,是否只有一个".so"库,我可以添加到我的Android Studio项目中,它将与我的项目捆绑在一起,并允许应用程序在运行时找到所需的Mat类,这就是我所需要的全部?

提前谢谢。

有三种方法可以将OpenCV包含在应用中

  1. 使用NDK编译opencv并编写自己的包装器以包含opencv c++代码
  2. 导入Android OpenCV SDK提供的OpenCV java包装器模块,并将其连接到手机上安装的OpenCV manager
  3. 导入Android OpenCV SDK提供的OpenCV java包装器模块,并复制项目中的本地库

对于选项1,您必须设置ndk项目。对于2,3,您可以简单地导入opencv android模块,并通过调用-在代码中初始化它

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

请参阅以下链接,在您的android工作室项目-中设置opencv android sdk

http://blog.codeonion.com/2015/11/25/creating-a-new-opencv-project-in-android-studio/

Android Studio 中的OpenCV

大多数opencv功能都可以使用java包装器直接访问。因此,您可能不需要将任何Mat传递给本机C函数。如果您仍然想调用本机函数,可以参考Opencv Java包装器以获得帮助,甚至可以参考SDK提供的示例以进一步了解。