Tomcat中OpenCV的UnsatisfiedLinkError

时间:2014-02-15 07:27:43

标签: java tomcat opencv java-native-interface spring-tool-suite

首先,我有一个在main方法中运行的OpenCV的基本示例。 但是,如果我在Spring Web Controller中使用OpenCV,则会引发错误。

我在STS(Spring Tool Suite)中的 Tomcat 服务器中运行以下代码时遇到UnsatisfiedLinkError,并将问题归结为以下代码:

System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
CascadeClassifier cascadeClassifier = new CascadeClassifier();

服务器和“main”应用程序的运行配置包含指向OpenCV DLL的VM Arguments:

-Djava.library.path="C:\opencv\build\java\x64;C:\opencv\build\x64\vc10\bin"

作为参考,我还在下面列出了堆栈跟踪的相关位:

org.springframework.web.util.NestedServletException: Handler processing failed;
nested exception is
java.lang.UnsatisfiedLinkError: org.opencv.objdetect.CascadeClassifier.CascadeClassifier_0()J
...
Caused by: java.lang.UnsatisfiedLinkError:
org.opencv.objdetect.CascadeClassifier.CascadeClassifier_0()J
    at org.opencv.objdetect.CascadeClassifier.CascadeClassifier_0(Native Method)
    at org.opencv.objdetect.CascadeClassifier.<init>(CascadeClassifier.java:38)
    at com.immersion.test.controllers.SimpleController.createClassifier(SimpleController.java:19)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

注意:我已在several StackOverflow线程中读到,UnsatisfiedLinkError的主要原因是缺少System.loadLibrary(Core.NATIVE_LIBRARY_NAME)调用。这显然不是这里的情况,因为它正在抛出异常的上方被调用。

2 个答案:

答案 0 :(得分:1)

这里也是一样。

我尝试迪伦所说的,但在这里没有用。

但我添加了&#34; C:\ opencv \ build \ java \ x64; C:\ opencv \ build \ x64 \ vc10 \ bin&#34;在我的PATH变量上。在我的sys变量上。

enter image description here

ps:我正在使用Windows。

答案 1 :(得分:0)

事实证明,在STS / Eclipse中启动Tomcat服务器的默认运行配置基本上只是Tomcat的启动器。 这意味着添加到Tomcat“运行配置”的任何VM Args都不会传输到实际的Tomcat实例。

在查看Tomcat目录中的tcruntime-instance.bat时(这最终会创建tomcat java实例),我们可以看到只需将我们想要的VM Args添加到JAVA_OPTS环境变量中, dll将可供Tomcat使用。

<强> TL; DR:

所以..只需将OpenCV二进制文件的位置添加到JAVA_OPTS环境变量中:

-Djava.library.path="C:\opencv\build\java\x64;C:\opencv\build\x64\vc10\bin"

有关为Tomcat设置JAVA_OPTS的更多信息,请参阅this SO question