我发现无法运行依赖于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链接,以便人们可以自己查看是否有帮助。
答案 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文件。它会工作得很好。