我正在尝试将OpenCV库添加到终端的Java程序的构建路径中,以便我可以使用shell脚本按顺序在一堆图像文件上运行程序。我项目的.class文件位于 Documents / Programming / Ko / bin 中,OpenCV库的.jar文件位于 Documents / Programming / opencv-2.4.10 / build中/ bin中即可。正如在这里提出的许多不同问题所建议的,我已经尝试过(在Ko / bin目录中):
java -cp "/Users/jordan/Documents/Programming/opencv-2.4.10/build/bin/*:." Ko <image_name>
产生以下错误:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no opencv_java2410 in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1857)
at java.lang.Runtime.loadLibrary0(Runtime.java:870)
at java.lang.System.loadLibrary(System.java:1119)
at Ko.main(Ko.java:37)
因此该程序在第37行遇到问题。这一行是:
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
我在运行加载Eclipse中的OpenCV库的问题之后添加了这一行,来自这里的另一个问题的建议,虽然我不确定它的作用或为什么它是必要的。当我尝试评论这一行时,我得到了类似的错误:
Exception in thread "main" java.lang.UnsatisfiedLinkError: org.opencv.highgui.Highgui.imread_0(Ljava/lang/String;I)J
at org.opencv.highgui.Highgui.imread_0(Native Method)
at org.opencv.highgui.Highgui.imread(Highgui.java:309)
at Ko.main(Ko.java:39)
这次是在第39行,这在逻辑上是我第一次从OpenCV库调用方法。
据我所知,我编写java -cp ...
命令的方式与我在此处阅读的问题对其他人的工作方式相同。如果有人可以告诉我哪里出错了,并且可以解释为什么在这种特殊情况下需要调用System.loadLibrary(),而在其他情况下导入库则不然,非常感谢。
答案 0 :(得分:1)
问题是命令行不知道本机库在磁盘上的位置(即opencv2.so文件)。在命令中添加额外标志并指定本机库的路径后,程序正确执行:
java -D'java.library.path=<path to native libraries>' -cp '<path to Ko.class>:<path to opencv-2.4.x jar file>' Ko <path to input image file>
第一个标志(-D)将java.library.path变量设置为特定于此应用程序的本机库,以便JRE知道jar文件链接到的位置。 第二个标志(-cp)设置类路径(JRE查找要运行的文件的目录)。这些目录在OSX / Linux / Unix上用冒号(:)分隔,在Windows上用分号(;)分隔。
希望这有助于将来遇到此问题的任何人。