首先,我有一个在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)
调用。这显然不是这里的情况,因为它正在抛出异常的上方被调用。
答案 0 :(得分:1)
这里也是一样。
我尝试迪伦所说的,但在这里没有用。
但我添加了&#34; C:\ opencv \ build \ java \ x64; C:\ opencv \ build \ x64 \ vc10 \ bin&#34;在我的PATH变量上。在我的sys变量上。
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。