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

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)
1个回答

5

简短回答

为了使用JavaCV,您必须在系统上安装OpenCV(如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需要两个组件:
1. 一个Java库(通常具有扩展名*.jar),其中包含调用本地库的Java方法。 2. 一个本地库(通常具有扩展名*.so用于Linux或*.dll用于Windows),该库"完成工作",在这种情况下,即使用OpenCV库。
第一个组件由JavaCV提供并包含在您的jar应用程序中。第二个组件是系统相关的(操作系统、架构等),必须在Java库路径中。
这是实际错误:无法在java.library.path中找到libjniopencv_core.so。 jniopencv_core库也由JavaCV提供,但安装在系统的某个位置(例如/usr/lib/),因此未包含在最终的jar中。
即使您找到了将其包含在最终应用程序中的方法,该库也需要使用未安装在系统上的OpenCV库。总结需求如下:
1. JavaCV Java库,将使用JNI调用: 2. JavaCV本地库,将使用: 3. OpenCV库,真正完成工作。
缺少其中任何一个点,应用程序都将无法运行。因此,必须在系统中安装OpenCV和JavaCV。

1
在我的系统中,已经安装了OpenCV。当我尝试从Eclipse运行项目时,一切都正常。但是当我尝试从可运行的JAR文件运行相同的项目时,出现问题了。我发现问题在于我没有包含.dll文件,那么我该怎么做呢? - Abhishek Choudhary
面临相同的问题,请帮忙。 - slaveCoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接