Экспорт исполняемого файла JAR, который использует opencv
При экспорте в eclipse я выбираю "Упаковать необходимые библиотеки в сгенерированный jar". Файл jar работает только на моей машине. Однако, когда я тестирую его на другом компьютере, это дает следующее исключение:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no jniopencv_core in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1681)
at java.lang.Runtime.loadLibrary0(Runtime.java:840)
at java.lang.System.loadLibrary(System.java:1047)
at com.googlecode.javacpp.Loader.loadLibrary(Loader.java:593)
at com.googlecode.javacpp.Loader.load(Loader.java:489)
at com.googlecode.javacpp.Loader.load(Loader.java:431)
at com.googlecode.javacv.cpp.opencv_core.<clinit>(opencv_core.java:136)
at mains.<clinit>(mains.java:25)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:266)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:56)
1 ответ
Короткий ответ
Вы должны установить OpenCV (как указано в требованиях JavaCV) и JavaCV в системе, чтобы использовать JavaCV. Поскольку вы, вероятно, установили их для разработки на своем компьютере, приложение работает, но на другой машине они, вероятно, не установлены, и поэтому jar
не работает
Длинный ответ
Проблема не в библиотеке JavaCV, которая, кажется, правильно включена в ваш jar
как показано линиями:
at com.googlecode.javacpp.Loader.loadLibrary(Loader.java:593)
at com.googlecode.javacpp.Loader.load(Loader.java:489)
at com.googlecode.javacpp.Loader.load(Loader.java:431)
at com.googlecode.javacv.cpp.opencv_core.<clinit>(opencv_core.java:136)
Дело в том, что JavaCV построен поверх OpenCV. OpenCV - это библиотека C++, единственный способ использовать ее из Java - использовать вызовы JNI.
JNI требуется два компонента:
- Библиотека Java (обычно с расширением
*.jar
) содержащий Java-метод, который вызывает нативную библиотеку - Собственная библиотека (обычно с расширением
*.so
для Linux или*.dll
для Windows), которые "делают работу", в данном случае "используют библиотеку OpenCV"
Первый предоставлен JavaCV и включен в ваш jar
приложение. Второй зависит от системы (ОС, архитектура, ...) и должен находиться в пути к библиотеке Java.
Это фактическая ошибка: он не может найти libjniopencv_core.so
в java.library.path
, jniopencv_core
библиотека также предоставляется JavaCV, но установлена где-то в системе (/usr/lib/
например) и, следовательно, не включены в финал jar
,
Даже если вы найдете способ включить его в конечное приложение, этой библиотеке нужно будет использовать библиотеки OpenCV, которые также не установлены в системе. Чтобы подвести итог потребностей:
- JavaCV библиотека Java, которая будет вызывать (с JNI):
- Собственная библиотека JavaCV, которая будет использовать:
- Библиотеки OpenCV, которые действительно будут работать.
Без этого пункта приложение не будет работать. Таким образом, OpenCV и JavaCV должны быть установлены в систему.