2016-06-13 71 views
0

我正在开发一个java应用程序,它调用本地c库中的一个功能。本地函数需要一个指向Opencv Mat类型的指针,所以我需要能够在我的Java应用程序中创建一个Opencv Mat类型以传递给本地库。在Android Java应用程序中使用OpenCV Mat。 NoClassDefFound错误与OpenCV垫

我正在使用Android Studio,并且已将'opencv库'.jar文件添加到我的项目的libs文件夹中。因此,我可以导入所需的Opencv模块并创建Opencv Mat类型/访问其功能。问题是,在运行时,我发现了以下错误:

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

我读过OpenCV的.jar文件,就在本机功能的包装和应用程序需要“本地库”。我如何找到/添加这个?我需要添加到我的项目中以便应用程序可以在运行时找到Opencv Mat类定义?我只想使用OpenCV Mat类型,而不是其他的。

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

在此先感谢。

回答

1

方式有3种,包括OpenCV的在你的应用

  1. 使用NDK编译OpenCV的,写自己的包装,包括您的OpenCV的C++代码。
  2. 导入Android Opencv SDK提供的OpenCV java包装模块,并将其连接到安装在手机上的Opencv管理器。
  3. 导入Android Opencv SDK提供的OpenCV java包装模块,并将原生库复制到项目中。

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

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); 
    } 

请参考以下链接安装OpenCV的Android SDK中在你的Android Studio项目 -

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

OpenCV in Android Studio

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

+1

当然你也可以使用其他的opencv封装类库,比如JavaCV,如果你想要的话也包括其他一些库。 –

+0

谢谢!我认为选项3可能是我正在寻找的选项。只是不确定要复制哪些本地库或哪些链接有帮助。 – CSharp