出口可执行的JAR文件,它使用了OpenCV(Exporting Executable jar fi

2019-09-01 09:18发布

而在日食出口,我选择“包所需的库到生成的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)

Answer 1:

简答

您必须安装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库(通常是用扩展*.jar )包含Java方法调用本机库
  • 本机库(通常是用扩展*.so或用于Linux *.dll适用于Windows)说:“做工作”,在这种情况下“使用OpenCV库”

第一个是由JavaCV提供,纳入您的jar应用。 第二个是依赖于系统(OS,建筑,...),并且必须是到Java库路径。

这是实际的错误:它无法找到libjniopencv_core.sojava.library.path 。 所述jniopencv_core库由JavaCV提供太多,但在某处安装在系统(上/usr/lib/例如),因此不包括在最终jar

即使你想办法把它列入到最终的应用程序,该库将需要使用未在系统上安装过OpenCV的库。 总结需求:

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

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



文章来源: Exporting Executable jar file that uses opencv