Сборка OpenCV на java, без создания папки java в сборке

Я пытаюсь собрать OpenCV из исходного кода в .jar, так как мне нужны дополнительные библиотеки, такие как Aruco (и они не входят в стандартную загрузку с OpenCV.

Следуя руководство, я установил CMake, и настройка дает следующие (части) вывода:

OpenCV modules:
    To be built:                 aruco bgsegm bioinspired calib3d ccalib core datasets dnn dnn_objdetect dpm face features2d flann fuzzy hfs highgui img_hash imgcodecs imgproc java java_bindings_generator line_descriptor ml objdetect optflow phase_unwrapping photo plot python_bindings_generator reg rgbd saliency shape stereo stitching structured_light superres surface_matching text tracking ts video videoio videostab xfeatures2d ximgproc xobjdetect xphoto
    Disabled:                    js python3 world
    Disabled by dependency:      -
    Unavailable:                 cnn_3dobj cudaarithm cudabgsegm cudacodec cudafeatures2d cudafilters cudaimgproc cudalegacy cudaobjdetect cudaoptflow cudastereo cudawarping cudev cvv dnn_modern freetype hdf matlab ovis python2 python2 sfm viz
    Applications:                perf_tests apps
    Documentation:               NO
    Non-free algorithms:         YES


...

Java:                          
    ant:                         C:/opencv-3.4.1/apache-ant-1.10.5-bin/bin/ant.bat (ver 1.8.0)
    JNI:                         C:/Program Files/Java/jdk1.8.0_171/include C:/Program Files/Java/jdk1.8.0_171/include/win32 C:/Program Files/Java/jdk1.8.0_171/include
    Java wrappers:               YES
    Java tests:                  NO

Затем после запуска mingw32-make в папке сборки, настроенной CMake, сборка выполняется без ошибок. Затем в папке build/bin я нашел файл opencv-341.jar, как и ожидалось.

Когда я связываю эту библиотеку в своей IntelliJ IDEA, такие модули, как org.opencv.aruco, распознаются, как и ожидалось. Однако при попытке создать java-проект я получаю эту ошибку:

java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)

Caused by: java.lang.UnsatisfiedLinkError: no opencv_java341 in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867)
at java.lang.Runtime.loadLibrary0(Runtime.java:870)
at java.lang.System.loadLibrary(System.java:1122)
at AraInvaders.Main.main(Main.java:24)
... 11 more

После некоторого исследования я понял, что забыл связать расположение собственной библиотеки, как было также описано в руководстве. Однако, согласно этому руководству (и другим ресурсам), сборка должна включать папку build/java/x64, содержащую файл .dll, однако папки build/java нет вообще.

Я нахожу libopencv_java341.dll в build/lib, однако связывание этого файла не решает проблему. Изображение, показывающее, что файл .dll связан

Когда я загружаю пакет Windows из OpenCV, в папке сборки есть папка Java, которая включает в себя файл .jar и папку /x64, однако они не включают предоставленные библиотеки, поэтому я пытаюсь создать из источника.

Итак, вопрос в том, что мне делать, чтобы правильно настроить библиотеку OpenCV, включая дополнительные библиотеки?

Хорошая мысль, я удалил этот тег!

DroneDevDing 24.07.2018 02:29
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
1 273
2

Ответы 2

Я спросил на форуме OpenCV http://answers.opencv.org/question/210451/opencv-401-face-module-for-java/.

Итак, есть два решения:

  1. Поскольку вы динамически создавали библиотеки OpenCV, opencv_java.dll зависит от opencv_core.dll, opencv_imgproc.dll и т.д ... вам необходимо добавить папку, содержащую их, в PATH вашей системы

  2. Отключите флаг BUILD_SHARED_LIBS и соберите все заново.

Я переименовал сгенерированную dll из libopencv_java412.dll в opencv_java412.dll, и это решило проблему пути к библиотеке («UnsatisfiedLinkError»).

412 в имени файла - это потому, что я использую OpenCV 4.1.2.

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