OpenCV生成到Java,而不在生成中生成Java文件夹

时间:2018-07-24 00:12:46

标签: java opencv intellij-idea cmake

我正在尝试将OpenCV从源代码构建到.jar,因为我需要拥有一些贡献的库,例如Aruco(并且这些库不包含从OpenCV的默认下载。

tutorial之后,我设置了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

然后在由CMake配置的构建文件夹中运行mingw32-make之后,它会正确构建。然后在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,但是链接该文件并不能解决问题。 Image showing that .dll file is linked

当我从OpenCV下载Windows软件包时,build文件夹中有一个Java文件夹,它确实包含.jar文件和/x64文件夹,但是,这些文件夹不包含贡献者。库,这就是为什么我试图从源代码构建。

问题是,我应该怎么做才能正确设置OpenCV库,包括提供的库?

2 个答案:

答案 0 :(得分:0)

我在OpenCV论坛http://answers.opencv.org/question/210451/opencv-401-face-module-for-java/上提问。

因此,有两种解决方案:

  1. 由于您是动态构建的OpenCV库,因此opencv_java.dll依赖于opencv_core.dllopencv_imgproc.dll等,您必须将包含它们的文件夹附加到系统的PATH中

  2. 关闭BUILD_SHARED_LIBS标志并重新构建所有内容。

答案 1 :(得分:0)

我将生成的dll从libopencv_java412.dll重命名为opencv_java412.dll,并解决了库路径问题(“ UnsatisfiedLinkError”)。

文件名中的412是因为我使用的是OpenCV 4.1.2。