如何从命令行(Unix)将外部库(OpenCV .jar文件)添加到Java构建路径

时间:2015-02-25 19:20:43

标签: java unix opencv terminal classpath

我正在尝试将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(),而在其他情况下导入库则不然,非常感谢。

1 个答案:

答案 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上用分号(;)分隔。

希望这有助于将来遇到此问题的任何人。