2015-10-15 98 views
0

我發現運行我的程序依賴於OpenCV jar文件是不可能的。我編譯了「javac -cp opencv-300.jar * .java」,但試圖運行java程序意味着它找不到主類,所以我運行java程序。程序,它拋出了有關查找OpenCV類的異常。運行一個Java程序引用OpenCV的Jar文件

我試過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

在哪個包中是主要的?嘗試'java ... your.package.MainClass' – Marged

+0

是的,這就是我所做的「Program.Program」是我的例子。這個問題似乎是OpenCV的jar文件,儘管在編譯期間工作,但在執行過程中似乎沒有什麼幫助。 –

+0

您有所有依賴性問題。首先,您對opencv-java300.jar具有編譯時間依賴性。其次,在同一個jar中有運行時依賴項,並且該jar對opencv本機庫有運行時依賴項。你有沒有嘗試設置日食與opencv合作,並從那裏運行?這將是一個很好的第一步 - 有這樣的指導。最後,Java包應該以全部小寫命名。 – medloh

回答

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(); 
    } 
} 

}

變化主要或調用OpenCV函數之前Static { System.loadLibrary(Core.NATIVE_LIBRARY_NAME); }LoadLibrary.loadOpenCV();

並嘗試從Eclipse中導出您的jar文件。它會工作得很好。

+0

@SeanKelly你應該標記問題是否幫助你。 –

相關問題