UnsatisfiedLinkError with OpenCV in Tomcat

爷,独闯天下 提交于 2019-12-30 11:21:27

问题


First of all, I have a basic example of OpenCV running in a main method. However, if I use OpenCV in a Spring Web Controller, an error is thrown.

I am getting an UnsatisfiedLinkError when running the following code inside a Tomcat Server, within STS (Spring Tool Suite), and have boiled the problem down to the following code:

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

The run configurations of both the server and the "main" application contain the VM Arguments pointing to the OpenCV DLLs:

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

For reference, I have also included the pertinent bits of the stacktrace below:

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)

Note: I have read in several StackOverflow threads that the main cause of the UnsatisfiedLinkError is the missing System.loadLibrary(Core.NATIVE_LIBRARY_NAME) call. This is clearly not the case here, since it is being called just above where the exception is thrown.


回答1:


Same thing here.

I try what Dylan said, but did not work here.

But I added "C:\opencv\build\java\x64;C:\opencv\build\x64\vc10\bin" on my PATH variable. On my sys variables.

ps: I'm using windows.




回答2:


It turns out that the default run configuration to start a Tomcat server within STS/Eclipse is essentially just a launcher for Tomcat. This means that any VM Args that are added to the Tomcat 'run configuration' will not be transferred to the actual Tomcat instance.

On looking in tcruntime-instance.bat within the Tomcat directory (this is what ends up creating the tomcat java instance), we can see that simply by adding our intended VM Args to the JAVA_OPTS environment variable, the dlls will be available to Tomcat.

TL;DR:

So.. Simply add the the locations of the OpenCV binaries to your JAVA_OPTS environment variable:

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

For more information on setting JAVA_OPTS for Tomcat, see this SO question.



来源:https://stackoverflow.com/questions/21794703/unsatisfiedlinkerror-with-opencv-in-tomcat

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!