如何从命令行 (Unix) 添加外部库(OpenCV .jar 文件)到 Java 构建路径
How to add an external library (OpenCV .jar file) to the Java build path from the command line (Unix)
我正在尝试从终端将 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 变量设置为特定于此应用程序的本机库,以便 JRE 知道 jar 文件链接到何处。
第二个标志 (-cp) 设置 class 路径(JRE 在哪些目录中查找文件 运行)。这些目录在 OSX/Linux/Unix 上用冒号 (:) 分隔,在 Windows.
上用分号 (;) 分隔
希望这对以后 运行 遇到此问题的任何人有所帮助。
我正在尝试从终端将 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 变量设置为特定于此应用程序的本机库,以便 JRE 知道 jar 文件链接到何处。 第二个标志 (-cp) 设置 class 路径(JRE 在哪些目录中查找文件 运行)。这些目录在 OSX/Linux/Unix 上用冒号 (:) 分隔,在 Windows.
上用分号 (;) 分隔希望这对以后 运行 遇到此问题的任何人有所帮助。