我正在尝试从终端将 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() 是必要的,而在其他导入库的情况下则不需要,我们将不胜感激。
最佳答案
问题是命令行不知道本地库在磁盘上的位置(即 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 变量设置为特定于此应用程序的 native 库,以便 JRE 知道 jar 文件链接到何处。 第二个标志 (-cp) 设置类路径(JRE 在哪些目录中查找要运行的文件)。这些目录在 OSX/Linux/Unix 上用冒号 (:) 分隔,在 Windows 上用分号 (;) 分隔。
希望这对以后遇到此问题的任何人有所帮助。
关于java - 如何从命令行 (Unix) 将外部库(OpenCV .jar 文件)添加到 Java 构建路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28727766/