gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 22:31:54 26 4
gpt4 key购买 nike

我的情况几乎和这个问题一样: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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com