【问题标题】:How to place only actually needed files of OpenCV library to my app folder to make portable java application (Executable Jar)?如何仅将 OpenCV 库的实际需要的文件放置到我的应用程序文件夹中以制作可移植的 Java 应用程序(可执行 Jar)?
【发布时间】:2014-04-07 04:04:05
【问题描述】:

我的情况与这个问题几乎相同: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中?

【问题讨论】:

  • 实际上,.../mingw 文件夹中的所有文件,除了 opencv_ffmpeg242.dll 的名称中都有 lib 前缀,并且没有 opencv_libname242d .dll 版本的 opencv_libname242.dll 文件

标签: java opencv executable-jar javacv


【解决方案1】:

与问题的第 1 部分相关:

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

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

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

现在关于问题的第 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

使用此代码 sn-p,您可以将所有 dll 放入应用的可运行 jar 文件夹的 your_opencv_subfolder 子文件夹中,然后执行类似的操作

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

在使用 opencv 库之前。

【讨论】:

    猜你喜欢
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多