导出使用opencv的可执行jar文件

在Eclipse中导出时,我select“将所需的库包装到生成的jar”。 jar文件只能在我的机器上运行。 但是,当我在其他机器上testing它时,会出现以下exception:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no jniopencv_core in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1681) at java.lang.Runtime.loadLibrary0(Runtime.java:840) at java.lang.System.loadLibrary(System.java:1047) at com.googlecode.javacpp.Loader.loadLibrary(Loader.java:593) at com.googlecode.javacpp.Loader.load(Loader.java:489) at com.googlecode.javacpp.Loader.load(Loader.java:431) at com.googlecode.javacv.cpp.opencv_core.<clinit>(opencv_core.java:136) at mains.<clinit>(mains.java:25) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:266) at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:56) 

简短的回答

您必须在系统上安装OpenCV(如JavaCV要求中所述 )和JavaCV才能使用JavaCV。 正如你可能在你的计算机上安装它们进行开发的应用程序工作,但另一台机器可能没有安装它们,因此该jar不起作用。

长答案

问题不在于JavaCV库,它似乎正确地包含在你的jar ,如下所示:

 at com.googlecode.javacpp.Loader.loadLibrary(Loader.java:593) at com.googlecode.javacpp.Loader.load(Loader.java:489) at com.googlecode.javacpp.Loader.load(Loader.java:431) at com.googlecode.javacv.cpp.opencv_core.<clinit>(opencv_core.java:136) 

JavaCV是建立在OpenCV之上的。 OpenCV是一个C ++库,从Java使用它的唯一方法是使用JNI调用。

JNI需要两个组件:

  • 包含调用本机库的java方法的java库(通常带有扩展名*.jar
  • 一个本地库(通常扩展名为*.so for linux或*.dll for windows)“做这个工作”,在这种情况下“使用OpenCV库”

第一个由JavaCV提供,并包含在你的jar应用程序中。 第二个是依赖于系统(Os,architecture,…),并且必须放入java库路径中。

这是实际的错误:它找不到java.library.path libjniopencv_core.sojniopencv_core库也由JavaCV提供,但是安装在系统的某个地方(例如/usr/lib/ ),因此不包含在最终的jar

即使您找到了将其包含在最终应用程序中的方法,该库也需要使用系统上未安装的OpenCV库。 总结需求:

  1. JavaCV的Java库 ,将调用(与JNI):
  2. JavaCV本地库 ,将使用:
  3. OpenCV库 ,这将真正的工作。

没有这一点的应用程序将无法正常工作。 因此,OpenCV和JavaCV必须安装到系统中。