2015-10-15 161 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你应该标记问题是否帮助你。 –