您需要將靜態庫打包爲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();
}
}
}
變化主要或調用OpenCV函數之前Static { System.loadLibrary(Core.NATIVE_LIBRARY_NAME); }
到LoadLibrary.loadOpenCV();
。
並嘗試從Eclipse中導出您的jar文件。它會工作得很好。
在哪個包中是主要的?嘗試'java ... your.package.MainClass' – Marged
是的,這就是我所做的「Program.Program」是我的例子。這個問題似乎是OpenCV的jar文件,儘管在編譯期間工作,但在執行過程中似乎沒有什麼幫助。 –
您有所有依賴性問題。首先,您對opencv-java300.jar具有編譯時間依賴性。其次,在同一個jar中有運行時依賴項,並且該jar對opencv本機庫有運行時依賴項。你有沒有嘗試設置日食與opencv合作,並從那裏運行?這將是一個很好的第一步 - 有這樣的指導。最後,Java包應該以全部小寫命名。 – medloh