3

在 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)
4

1 回答 1

5

简短的回答

您必须在系统上安装 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 需要两个组件:

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

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

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

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

  1. JavaCV java 库,它将调用(使用 JNI):
  2. JavaCV 本机库,将使用:
  3. OpenCV 库,这将真正完成工作。

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

于 2013-04-30T20:56:16.977 回答