Экспорт исполняемого файла jar, который использует opencv

При экспорте в eclipse я выбираю «Упаковать необходимые библиотеки в сгенерированную банку». Файл 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)

person Hossam Alaa    schedule 29.04.2013    source источник


Ответы (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. Java-библиотека JavaCV, которая будет вызывать (с JNI):
  2. собственная библиотека JavaCV, которая будет использовать:
  3. Библиотеки OpenCV, которые действительно сделают работу.

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

person StreakyCobra    schedule 30.04.2013
comment
в моей системе установлен OpenCV. Как только я пытаюсь запустить проект из eclipse, все работает нормально. но когда я пытаюсь сделать то же самое из runnabelJar, это не так. Проблема, которую я обнаружил, заключалась в том, что я не включил файлы .dll, так как мне это сделать. - person Abhishek Choudhary; 01.10.2013
comment
Столкнулся с той же проблемой. Пожалуйста помоги - person slaveCoder; 01.04.2014