java - 如何仅将实际需要的 OpenCV 库文件放置到我的应用程序文件夹中以制作可移植的 Java 应用程序(可执行 Jar)?

标签 java opencv executable-jar javacv

我的情况几乎和这个问题一样:Trying to make java application (Executable Jar) that uses OpenCV portable. Getting unsatisfied link error .这个问题以及与这个问题相关联的问题帮助我了解更多。但我仍然需要帮助解决我的问题。我的问题实际上分为两个相互关联的问题:

  1. 如何确定我的应用程序实际需要的 opencv 库文件(只是为了抓取视频)

    在我的开发计算机上有许多目录显然包含与 opencv2.4.2 相同的 dll 文件集合(据我所知只需要 dll 文件):

    • opencv/build/x86/mingw
    • opencv/build/x86/vc9
    • opencv/build/x86/vc10
    • opencv/build/x64/mingw
    • opencv/build/x64/vc9
    • opencv/build/x64/vc10

    我了解 x86 和 x64 的划分,但是 mingw/vc9/vc10 呢?

  2. 如何将它们组织到我的可移植构建中?

    当我从我的项目创建可运行的 jar 时,我有一个不错的选项“将所需的库复制到生成的 JAR 旁边的子文件夹中”。该文件夹通常具有“_myApp__lib”形式的名称。假设我也将所需的 dll 文件放入该子文件夹。如何让我的可运行 jar 看到它们?我可以在没有-Djava.library.path 的情况下这样做吗?是否可以将dll文件放到单独的jar中?

最佳答案

与问题的第 1 部分相关:

据我所知,mingwvc9vc10 是用于创建相应构建的不同 c++ 编译器,但我仍然不知道知道如果我使用 mingwvc9 会发生什么变化。我只是选择了 vc10,因为它更加熟悉和新鲜。此处的任何解释将不胜感激。

但是这些文件并不是所有需要的文件!有 opencv/build/common/tbb 文件夹,您可以在其中找到 ia32(x86 版本,据我所知)和 intel64(x64 版本为好)文件夹又被编译器子文件夹划分。所以我又选择了vc10

一些 dll 文件,例如用于对象检测的文件,显然在我的项目中不需要,但我决定将它们全部保留。毕竟他们只需要 42Mb 而不是大约 2.5Gb 的整个解压的 openvc 库。

现在关于问题的第 2 部分

正如许多问题答案中所建议的(参见 Trying to make java application (Executable Jar) that uses OpenCV portable. Getting unsatisfied link erroradding openCV to java buildpath in eclipse 以及相关问题),您可以设置 path windows 环境变量或使用 java 命令行 -Djava.library。 path 开关以帮助您的应用程序找到那些 dll 文件或将它们放置到 path windows 环境变量中的文件夹之一。您甚至可以将整个库放在 C: 驱动器的根目录下。

但是有更好的决定!您可以在应用程序运行时使用此技巧随时更改 Java 系统属性 java.library.path:

public static void setLibPath(String path){
    System.setProperty( "java.library.path", path );

    Field fieldSysPath;
    try {
        fieldSysPath = ClassLoader.class.getDeclaredField( "sys_paths" );
        fieldSysPath.setAccessible( true );
        fieldSysPath.set( null, null );
    } catch (NoSuchFieldException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SecurityException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

一个想法来自这个page你可能会发现类似的技巧 here .

使用此代码片段,您可以将所有 dll 放置到您应用的可运行 jar 文件夹的 your_opencv_subfolder 子文件夹中,然后执行如下操作

setLibPath(System.getProperty("user.dir")+"\\your_opencv_subfolder")

在使用任何 opencv 库之前。

关于java - 如何仅将实际需要的 OpenCV 库文件放置到我的应用程序文件夹中以制作可移植的 Java 应用程序(可执行 Jar)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22191968/

相关文章:

java - 与 gradle intellij 一起使用的环境变量 - spring boot

java - 从 Java 代码调用 Spring Scheduler 执行

python - 将一张图像与 Cloudinary 存储进行比较

opencv - 哪些计算机视觉库和算法可用于人类行为分析?

Java .jar 未在 unix 中运行

java - 类路径问题 : . jar 文件可以从 list 中的类路径访问文件,但不能从 -cp 命令行参数访问文件

java - Android Canvas 试图绘制太大的异常

java - ClassNotFoundException : org. apache.shiro.web.env.EnvironmentLoaderListener

c++ - 如何在openCV中获取像素矩阵和 reshape 矩阵

java - 无法访问/运行项目中放置的可执行 jar