【问题标题】:Opencv Java exceptionOpencv Java 异常
【发布时间】:2012-10-02 04:31:14
【问题描述】:

我正在使用 Windows 7 并在尝试运行使用 opencv 库的 Java 项目时遇到此异常:

Exception in thread "main" 
java.lang.UnsatisfiedLinkError: no opencv_java in java.library.path
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at org.opencv.highgui.Highgui.<clinit>(Highgui.java:416)
at teste.main(teste.java:21)

我做错了什么?缺少一些进口吗?

我想在 Eclipse(不是 Android)中创建一个使用 openCV 的简单 Java 项目。

  • 所以我已经从 OpenCV-2.4.2.exe 文件中提取 javacv 到 C:\
  • 然后执行“cmake -G”MinGW Makefiles“-DBUILD_opencv_java=ON C:\opencv”命令,然后是“mingw32-make”。一切都是 构建没有错误或警告
  • 在我的环境变量中添加了 opencv dll 之后

【问题讨论】:

  • 你能添加一些代码来将 opencv 库集成到 java 中吗?看起来 Classloader 找不到库。
  • 在运行配置中,我添加了-Djava.library.path=C:\opencvFinal 参数。同样在 Java Build Path 中,我添加了外部类文件夹 C:\opencvFinal\bin,其中保存了所有 opencv dll。当我打电话给System.loadLibrary("opencv_java"); 时,它给了我例外。
  • 等等,你只有 dll 吗?您需要的是一个包装这些 dll 的 jar。或者您需要使用 jni 自己包装它们。
  • 这是我第一次遇到这个问题。你知道任何包装opencv dll的罐子吗?
  • 对不起,没有。我想如果你有类似 opencv_java 的东西,它们可能会生成。但是如果你只有dlls,那么你有很多工作要做。 或者找到一个现成的java集成。看,dll 是用于 C/C++ 的。要在 Java 中使用它们,您必须使用本机接口 (en.wikipedia.org/wiki/Java_Native_Interface#How_the_JNI_works)。

标签: java opencv


【解决方案1】:

引发此异常的原因是系统正在尝试查找 OpenCV 针对此特定平台所需的本地库,但没有找到。

Exception in thread "main" 
java.lang.UnsatisfiedLinkError: no opencv_java in java.

解决此错误

  1. 如果你使用的是opencv版本那么@user3033420给出的答案就是解决方案。
  2. 如果您使用版本 >= opencv 2.4.6,则 jar 在 Core 类 中有一个名为 NATIVE_LIBRARY_NAME 的常量变量,您给 FaceDetector 类中的 loadLibrary() 函数以在您的项目中包含 opencv 的功能,您可能已经有了这个:

    System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    

使用上面的命名常量,就不需要记住strang dll文件的名字了。

opencv 2.4.9.jar 添加到项目首选项的构建路径中:

Window -> Preferences -> Java Build Path –> Add Library -> User Libraries -> 
User Library -> & click New

您将看到如下对话框。 将 opencv-2.4.9 添加为库名称并点击确定。

然后Add External Jar 并找到您的 opencv jar 并单击确定。然后展开 opencv-2.4.9.jar 并点击 Native Library Location (None) 如下图:

必要步骤:输入“opencv-2.4.9”使用的native library所在文件夹的位置然后点击OK,如下图:

所以现在这个 jar 已经拥有了完成这项工作所需的所有本地库。重建java程序,一切都应该按照设计编译和运行。

【讨论】:

  • 我尝试做同样的事情,但我仍然收到此错误。还有其他解决方法吗?
  • @Manpreet 您使用的是哪个版本的 OpenCV?您是否为x86x64 平台尝试过此程序?到现在为止你做了什么?
  • 我使用的是 OpenCV 2.4.9。我在x86上。我在PATH变量中添加了dll的路径,我在项目中OpenCV 2.4.9 .jar文件的Native library选项下添加了它的路径。我正在使用 System.loadLibrary("openCV_java249") 在代码中加载库。
  • 你试过System.loadLibrary(Core.NATIVE_LIBRARY_NAME);这个代码吗?
  • @Manpreet 看看Github link to OpenCV 2.4.9 Java dll。尝试使用这些 dll。告诉我,这对你有用吗?
【解决方案2】:

如果您收到此错误:

Exception in thread "main" 
java.lang.UnsatisfiedLinkError: no opencv_java in java.library.path

这可能意味着您正在从臀部拍摄,通过布朗运动进行编程,试图让 openCV 工作。就像试图通过疯狂地按下所有按钮来弄清楚飞机在飞行中是如何工作的。你会过得很糟糕的。

错误的含义:

Eclipse 告诉您该 jar 文件找不到完成其工作所需的库。所以很自然,除非你让它们可用,否则它不会起作用。您必须在您的特定平台上找到有关“如何从源代码构建 openCV”的教程:(windows、mac、linux 等)、(32 位、64 位等)。

基本上,您忽略了“本机库位置”设置,或者没有正确设置它们,因此 jar 无法找到其在 C 中编写的支持库。

如何解决,千尺观:

  1. 为您的操作系统下载 openCV 的源代码。
  2. 按照说明从源代码构建 openCV。
  3. 将 jar 复制到 Java 项目的 lib 目录中。
  4. 通过将“本机库位置”设置为您从源代码构建 openCV 的路径下的build/lib 目录,配置 jar 以查找其本机库。
  5. 清理构建 java 项目,UnsatisfiedLinkError 应该会消失。

本篇博文详细介绍了上述步骤:https://udallascs.wordpress.com/2014/03/30/adding-opencv-and-configuring-to-work-with-eclipse-and-java/

为什么这不能只是一个简单的罐子?

因为大部分 openCV 都是用C 编程语言编写的。您使用的 jar 文件只是进入 C 世界的一个窗口。所以这是一个 rube Goldberg 机器。你会在现实工作世界中到处看到这类事情,所以要注意,你在这里接受教育。

【讨论】:

  • 强制编译OpenCV 以便为Eclipse 生成适当的系统相关库,这与Java 的可移植性理念背道而驰。顺便说一句:如果您的 GCC 版本至少为 5:/usr/include/host_config.h:105:2: error: #error -- unsupported GNU version! gcc 4.10 and up are not supported!OpenCV 编译会带来另一个问题。详细的 Eclipse 配置说明可参考here
【解决方案3】:

尝试通过这样做来加载库:

 System.loadLibrary("opencv_java244")

或者这样做:

 System.loadLibrary("opencv_java244")

没用 - 仍然出现同样的错误。

最后起作用的是提供 dylib 文件的完整路径并使用:

System.load(new File("/usr/local/Cellar/opencv/2.4.10.1/share/OpenCV/java/libopencv_java2410.dylib").getAbsolutePath());'

我正在使用 HomeBrew,但是您安装它只是找到文件并更新路径。

【讨论】:

    【解决方案4】:

    我找到了解决方案。实际 dll 位于 openCV\opencv\build\java\x64\ 文件夹中。在我的例子中,它的名字是 opencv_java247.dll ,所以我改变了java代码行

    System.loadLibrary("opencv_java244") 
    

    System.loadLibrary("opencv_java247") 
    

    我还在构建路径中将本机库位置设置为E:/Sagar_tools/tools/openCV/opencv/build/java/x64(dll 的完整路径)。

    【讨论】:

      【解决方案5】:

      函数loadlibrary 尝试在您的PATH 变量中查找DLL 的名称——检查DLL 名称。你也可以试试System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

      【讨论】:

        【解决方案6】:

        在这种情况下,您应该将 jvm 的路径指定为 opencv dll 文件的安装位置:-Djava.library.path="C:\opencv\build\java\x64" 并将代码添加为: System.loadLibrary(Core.NATIVE_LIBRARY_NAME); 因为,我在我的 netbeans ide 中尝试了这个,我的问题得到了解决。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-03-24
          • 2017-04-27
          • 1970-01-01
          • 2021-05-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多