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

时间:2013-04-29 15:53:58

标签: eclipse opencv ubuntu javacv pandaboard

在eclipse中导出时,我选择“将所需的库打包到生成的jar中”。 jar文件只能在我的机器上运行。但是,当我在其他机器上测试时,它会给出这个例外:

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)

1 个答案:

答案 0 :(得分:4)

简短回答

您必须在系统上安装OpenCV(如JavaCV requirements中所述)和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用于linux或*.dll用于Windows)“执行工作”,在本例中为“使用OpenCV库”

第一个由JavaCV提供,并包含在您的jar应用程序中。第二个是系统相关的(Os,体系结构,......),必须进入java库路径。

这是实际错误:它无法在libjniopencv_core.so中找到java.library.pathjniopencv_core库也由JavaCV提供,但安装在系统的某个位置(例如/usr/lib/),因此不包含在最终的jar中。

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

  1. JavaCV java库,将调用(使用JNI):
  2. JavaCV本地库,将使用:
  3. OpenCV库,这将真正开展工作。
  4. 如果没有这一点,应用程序将无法正常工作。因此必须在系统中安装OpenCV和JavaCV。