代码之家  ›  专栏  ›  技术社区  ›  Ruslan Zhomir

如何将OpenCV库中实际需要的文件放到我的应用程序文件夹中,以制作可移植的java应用程序(ExecutableJar)?

  •  1
  • Ruslan Zhomir  · 技术社区  · 11 年前

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

    1. 如何确定我的应用程序实际需要的opencv库文件(仅用于获取视频)

      在我的开发计算机上,有许多目录显然与openc24.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旁边的子文件夹中 “.文件夹的名称通常为” _我的应用程序库 “。假设我也将所需的dll文件放置到该子文件夹中。如何使我的可运行jar看到它们?如果没有Djava.library.path,我可以这样做吗?是否可以将dll文件放置在单独的jar中?”?

    1 回复  |  直到 11 年前
        1
  •  2
  •   Community CDub    7 年前

    与问题第1部分相关:

    正如我发现的, 明威牌手表 , 视频9 视频10 是不同的c++编译器用来创建相应的版本,但我仍然不知道如果我使用 明威牌手表 视频9 。我只是选择了 视频10 更加熟悉和新鲜。如有任何解释,我们将不胜感激。

    但这些文件并不是所有需要的文件!有 opencv/build/common/tbb 您将在其中找到的文件夹 国际原子能机构32 (据我所知,x86版本)和 整数64 (x64版本也是)文件夹,这些文件夹依次由编译器子文件夹划分。所以我选择了 视频10 再一次

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

    现在谈谈问题的第二部分

    正如许多问题答案中所建议的(参见 Trying to make java application (Executable Jar) that uses OpenCV portable. Getting unsatisfied link error adding openCV to java buildpath in eclipse 和链接的问题),您可以设置 路径 windows环境变量或使用java命令行 -雅加达图书馆.path 切换以帮助您的应用程序查找那些dll文件或将它们放置到 路径 windows环境变量。您甚至可以将整个库放在C:驱动器的根目录下。

    但还有更好的决定!您可以更改Java System属性 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放置到 您的_opencv_子文件夹 应用程序的可运行jar文件夹的子文件夹,然后执行以下操作

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

    在使用opencv库之前。