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

标签 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() 是必要的,而在其他导入库的情况下则不需要,我们将不胜感激。

最佳答案

问题是命令行不知道本地库在磁盘上的位置(即 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/

相关文章:

c++ - 如何在 Windows Vista 上编译为 Linux/Unix 编写的 C++ 源代码(给出的代码)

linux - 使用 Find/Grep 在一天中的特定时间之间搜索文件

c - 为什么 scanf 不能正确读取值?

opencv - 使用卡尔曼滤波器跟踪位置和速度

opencv - 无法安装虚拟python环境

java - 一个有效的 Unicode 字符串可以包含 FFFF 吗? Java/CharacterIterator 坏了吗?

java - JavaFX 中的样式文本?

opencv - 在移动movie.exe中无法通过0x7695c41f处的OpenCv ErrorUnhandled异常打开视频:

java - 如何使用 Java 更改 mm-dd-yyyy(来自 csv 文件的数据)的格式以在 MySql 中存储为 yyyy-mm-dd

java - 3Sum的两个相似算法之间的区别?