2013-08-16 19 views
8

Używam Opencv 2.4.5 z Javą przez pewien czas budując aplikację i chciałbym teraz rozpowszechnić aplikację. Bibliotekę ładuje się, używając:Jak pakietować opencv + java w słoiku

static{ 
     System.loadLibrary("opencv_java245"); 
    } 

co działa dobrze. Jednak podczas eksportowania, to nie działa, gdy uruchomiony ze słoika:

java -jar build1.jar 

Plik opencv_java245.jar jest włączone jako biblioteki użytkownika, z native pliku (libopencv_java245.dylib) podłączonego do niego. Podczas uruchamiania pliku wykonywalnego jar wygenerowanego z Eclipse, otrzymuję poniżej UnsatisfiedLinkError, pomimo rzeczy kompilujących/działających dobrze w czasie zaćmienia.

Exception in thread "main" java.lang.UnsatisfiedLinkError: no opencv_java245 in java.library.path 
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860) 
    at java.lang.Runtime.loadLibrary0(Runtime.java:845) 
    at java.lang.System.loadLibrary(System.java:1084) 
    at com.drawbridge.Main.<clinit>(Main.java:12) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:266) 
    at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:56) 

Ktoś zna prosty sposób pakowania OpenCV w słoik?

Aktualizacja: wyczerpałem już wszystko. Mogę dodać bibliotekę do mojej ścieżki budowania (i nie używać System.loadLibrary), która działa w środowisku Eclipse, ale nie w pakiecie w słoiku. Próbowałem wszystkiego. Sprawdziłem również typ biblioteki dynamicznej, którą próbuję wczytać - to jest to, że wygląda na to, że powinna działać poprawnie. Użyłem -D64 i -D32 do przetestowania i uzyskania tego samego wyniku z obydwoma.

+1

możliwe duplikat [Extract i załadować DLL z JAR] (http://stackoverflow.com/questions/4764347/extract -and-load-dll-from-jar) –

+2

Nie można wczytać natywnej biblioteki (lub biblioteki DLL) bezpośrednio z pliku JAR. Zobacz powiązane pytanie, jak sobie z tym poradzić. –

+0

Dzięki @StephenC Próbowałem tej metody i nadal uzyskać UnsatisfiedLinkError, ale z inną wiadomość (coś podobnego do nieznanego typu). – alistair

Odpowiedz

10

Jak powiedział Steven C, było tak jak w Extract and load DLL from JAR, a także w bug report. Byłem trochę nieświadomy, jak używać dylibs i starałem się być zgodnym z OpenCV tutorial, który użył "biblioteki użytkownika", aby dodać słoik, a następnie dodać rodzimy dylib. Z jakiegoś powodu ładowanie zasobów nawet przy użyciu "/" ładowało się z katalogu src, a nie z katalogu głównego mojego projektu (co miało miejsce w projekcie testowym, który zrobiłem).

Dla tych, którzy próbują zrobić to samo, tu jest jakiś kod, aby pomóc:

private static void loadLibrary() { 
    try { 
     InputStream in = null; 
     File fileOut = null; 
     String osName = System.getProperty("os.name"); 
     Utils.out.println(Main.class, osName); 
     if(osName.startsWith("Windows")){ 
      int bitness = Integer.parseInt(System.getProperty("sun.arch.data.model")); 
      if(bitness == 32){ 
       Utils.out.println(Main.class, "32 bit detected"); 
       in = Main.class.getResourceAsStream("/opencv/x86/opencv_java245.dll"); 
       fileOut = File.createTempFile("lib", ".dll"); 
      } 
      else if (bitness == 64){ 
       Utils.out.println(Main.class, "64 bit detected"); 
       in = Main.class.getResourceAsStream("/opencv/x64/opencv_java245.dll"); 
       fileOut = File.createTempFile("lib", ".dll"); 
      } 
      else{ 
       Utils.out.println(Main.class, "Unknown bit detected - trying with 32 bit"); 
       in = Main.class.getResourceAsStream("/opencv/x86/opencv_java245.dll"); 
       fileOut = File.createTempFile("lib", ".dll"); 
      } 
     } 
     else if(osName.equals("Mac OS X")){ 
      in = Main.class.getResourceAsStream("/opencv/mac/libopencv_java245.dylib"); 
      fileOut = File.createTempFile("lib", ".dylib"); 
     } 


     OutputStream out = FileUtils.openOutputStream(fileOut); 
     IOUtils.copy(in, out); 
     in.close(); 
     out.close(); 
     System.load(fileOut.toString()); 
    } catch (Exception e) { 
     throw new RuntimeException("Failed to load opencv native library", e); 
    } 
+0

Co zrobić, jeśli systemem operacyjnym jest system Linux? –

+0

Wygląda na to, że Linux używa plików .so http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html – alistair

Powiązane problemy