8

我一直在使用 Opencv 2.4.5 和 Java 构建应用程序,现在想分发该应用程序。使用以下内容加载库:

static{ 
        System.loadLibrary("opencv_java245"); 
    }

效果很好。但是,在导出时,从 jar 运行时不起作用:

java -jar build1.jar 

opencv_java245.jar 文件作为用户库包含在内,其中连接了本机文件 (libopencv_java245.dylib)。运行从 Eclipse 生成的可执行 jar 时,我得到下面的 UnsatisfiedLinkError,尽管在 Eclipse 中编译/运行良好。

Exception in thread "main" java.lang.UnsatisfiedLinkError: no opencv_java245 in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860)
    at java.lang.Runtime.loadLibrary0(Runtime.java:845)
    at java.lang.System.loadLibrary(System.java:1084)
    at com.drawbridge.Main.<clinit>(Main.java:12)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:266)
    at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:56)

有人知道将 OpenCV 打包到 jar 中的简单方法吗?

更新:我现在已经用尽了一切。我可以将库添加到我的构建路径中(而不是使用 System.loadLibrary),并且可以在 Eclipse 中使用,但在打包到 jar 中时不能。我什么都试过了。我还检查了我要加载的动态库的类型 - 它是

Mach-O 64-bit x86_64 dynamically linked shared library

看起来它应该可以正常工作。我已经使用 -D64 和 -D32 来测试并得到相同的结果。

4

1 回答 1

11

正如 Steven C 所说,它就像在从 JAR 中提取和加载 DLL以及在错误报告中一样。我对如何使用 dylibs 有点无知,并试图与使用“用户库”添加 jar,然后添加本机 dylib的OpenCV 教程保持一致。此外,由于某种原因,即使使用“/”加载资源也是从 src 目录加载的,而不是从我的项目的根目录加载(在我制作的测试项目中就是这种情况)。

对于那些试图做同样事情的人,这里有一些代码可以提供帮助:

private static void loadLibrary() {
    try {
        InputStream in = null;
        File fileOut = null;
        String osName = System.getProperty("os.name");
        Utils.out.println(Main.class, osName);
        if(osName.startsWith("Windows")){
            int bitness = Integer.parseInt(System.getProperty("sun.arch.data.model"));
            if(bitness == 32){
                Utils.out.println(Main.class, "32 bit detected");
                in = Main.class.getResourceAsStream("/opencv/x86/opencv_java245.dll");
                fileOut = File.createTempFile("lib", ".dll");
            }
            else if (bitness == 64){
                Utils.out.println(Main.class, "64 bit detected");
                in = Main.class.getResourceAsStream("/opencv/x64/opencv_java245.dll");
                fileOut = File.createTempFile("lib", ".dll");
            }
            else{
                Utils.out.println(Main.class, "Unknown bit detected - trying with 32 bit");
                in = Main.class.getResourceAsStream("/opencv/x86/opencv_java245.dll");
                fileOut = File.createTempFile("lib", ".dll");
            }
        }
        else if(osName.equals("Mac OS X")){
            in = Main.class.getResourceAsStream("/opencv/mac/libopencv_java245.dylib");
            fileOut = File.createTempFile("lib", ".dylib");
        }


        OutputStream out = FileUtils.openOutputStream(fileOut);
        IOUtils.copy(in, out);
        in.close();
        out.close();
        System.load(fileOut.toString());
    } catch (Exception e) {
        throw new RuntimeException("Failed to load opencv native library", e);
    }
于 2013-09-13T07:23:02.437 回答