【问题标题】:IntelliJ executable Jar file with OpenCV带有 OpenCV 的 IntelliJ 可执行 Jar 文件
【发布时间】:2015-08-07 11:17:55
【问题描述】:

我正在尝试使用 IntelliJ 导出使用外部库(在本例中为 OpenCV)的 java 项目。最初,即使外部库已设置为依赖项,我仍不断收到“不满意的链接错误”。我在网上搜索了一下,发现必须在这里设置VM:

所以我将库路径设置为我的计算机中有 openCV 的位置。在我这样做之后,程序运行并正确编译。

我现在的任务是将项目导出到可运行的 jar 文件中,而目标计算机不需要安装 openCV。我听从了this post 的建议。这是我的设置工件的样子:

所以在我导出并尝试双击它之后,它什么也没做。然后我使用“java -jar .jar”运行它,这会导致旧的“Unsatisfied Link Error”问题:

我非常了解问题所在,但我不知道如何解决它...如何在可执行文件中设置 VM 选项以指向提取的 jar 文件?

【问题讨论】:

    标签: java opencv intellij-idea jar


    【解决方案1】:

    我认为您还应该在 build/lib 中包含来自 OpenCV 的本机库文件

    在我的 Mac 上是 libopencv_java310.dynlib

    在我的屏幕截图中,您可以看到 OpenCV java 库 (.jar),以及我的模块的编译输出,此外,我还包含了共享库的两个版本(Mac 为 .dynlib,Linux 为 .so)。

    如果你在 Windows 上,那么我猜你的 OpenCV 构建/安装会给你一个 .dll,你也应该包含它。

    如果您希望在运行/开发时从文件系统中找到共享库文件,但希望它的干净分发并且在其他人运行它时在 JAR 文件中找到它,那么您可能想要用这样的代码加载它,而不是处理这两种情况:

    import cz.adamh.utils.NativeUtils;
    
    class SimpleSample {
      static {
        try {
          System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        } catch (UnsatisfiedLinkError e) {
          try {
            NativeUtils.loadLibraryFromJar("/" + System.mapLibraryName(Core.NATIVE_LIBRARY_NAME));
          } catch (IOException e1) {
            throw new RuntimeException(e1);
          }
        }
      }
    

    您可以在他的 GitHub 上找到 cz.adamh.utils.NativeUtils 的实用程序类 https://github.com/adamheinrich/native-utils/blob/master/src/main/java/cz/adamh/utils/NativeUtils.java

    JAR 中文件的路径必须以“/”开头。在我的示例中,我的本机库位于 JAR 的根目录中,因此“/”是前置的。如果您将本机扩展放在 JAR 的子文件夹中,请在上面的代码中指定它的路径。

    然后在不同的平台上,我相信 JVM 会在您尝试在运行时加载它时找到“正确的”共享本机库。

    我已经用 SimpleSample(在 samples/java/ant 中)做到了。

    然后我使用 IntelliJ 菜单“Build > Built Artifacts”生成 JAR。

    然后我可以使用:

    java -jar ../opencv-java-sample/out/artifacts/SimpleSample_jar/SimpleSample.jar

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 2017-11-14
    • 2023-03-21
    • 1970-01-01
    • 2013-01-12
    • 2011-05-29
    • 1970-01-01
    相关资源
    最近更新 更多