Экспорт исполняемого файла 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, которые также не установлены в системе. Чтобы подвести итог потребностей:

  1. JavaCV библиотека Java, которая будет вызывать (с JNI):
  2. Собственная библиотека JavaCV, которая будет использовать:
  3. Библиотеки OpenCV, которые действительно будут работать.

Без этого пункта приложение не будет работать. Таким образом, OpenCV и JavaCV должны быть установлены в систему.

Другие вопросы по тегам