运行引用OpenCV的Jar文件的Java程序

时间:2015-10-15 05:07:59

标签: java opencv jar compilation

我发现无法运行依赖于OpenCV jar文件的程序。我已经编译了" javac -cp opencv-300.jar * .java",但是尝试运行java程序意味着它无法找到主类,所以我运行了java Program.Program查找有关查找OpenCV类的例外情况。

我试过java" -Djava.library.path ="。 -jar opencv-300.jar但只返回"没有主要的清单属性,在opencv-300.jar"中。我尝试重新编译jar并使用java -cp运行。 Program.Program并返回" UnsatisfiedLinkError:java.library.path"中没有opencv_java300,但这似乎是一条糟糕的道路。

有没有人知道我该怎么办该死的东西?试用Windows 8和Ubuntu 14.04LTS,两者都有相同的结果。请帮忙!

编辑:我可以上传公共Dropbox链接,以便人们可以自己查看是否有帮助。

1 个答案:

答案 0 :(得分:1)

您需要使用jar文件打包静态库,将该静态库加载到一个temperory文件,然后从该路径加载静态库。

在名为opencv的资源中创建一个文件夹,并将.dll.dylib.so个文件放在相应的文件夹中。

public class LoadLibrary {
public static void loadOpenCV() {
    try {
        InputStream inputStream = null;
        File fileOut = null;
        String osName = System.getProperty("os.name");
        System.out.println(osName);

        if (osName.startsWith("Windows")) {
            int bitness = Integer.parseInt(System.getProperty("sun.arch.data.model"));
            if (bitness == 32) {
                inputStream = LoadLibrary.class.getResourceAsStream("/opencv/windows/x86/opencv_java300.dll");
                fileOut = File.createTempFile("lib", ".dll");
            } else if (bitness == 64) {
                inputStream = LoadLibrary.class.getResourceAsStream("/opencv/windows/x64/opencv_java300.dll");
                fileOut = File.createTempFile("lib", ".dll");
            } else {
                inputStream = LoadLibrary.class.getResourceAsStream("/opencv/windows/x86/opencv_java300.dll");
                fileOut = File.createTempFile("lib", ".dll");
            }
        } else if (osName.equals("Mac OS X")) {
            inputStream = LoadLibrary.class.getResourceAsStream("/opencv/mac/libopencv_java300.dylib");
            fileOut = File.createTempFile("lib", ".dylib");
        }

//make check for linux

        if (fileOut != null) {
            OutputStream outputStream = new FileOutputStream(fileOut);
            byte[] buffer = new byte[1024];
            int length;

            while ((length = inputStream.read(buffer)) > 0) {
                outputStream.write(buffer, 0, length);
            }

            inputStream.close();
            outputStream.close();
            System.load(fileOut.toString());
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

在Main中或在调用OpenCV函数之前将Static { System.loadLibrary(Core.NATIVE_LIBRARY_NAME); }更改为LoadLibrary.loadOpenCV();

尝试从Eclipse导出jar文件。它会工作得很好。