2009-12-04 15 views
11

Powiel możliwe:
How to bundle a native library and a JNI library inside a JAR?Wiązanie rodzimy dll ze słoika

muszę zawierać natywną lib (jnotify ale myślę, że nie podlega materia) do mojego słoika. Chcę to zrobić z NetBeans.

Bundle-NativeCode: /lib/jnotify.dll; osname=win32 dodałem do mojego pliku manifest.mf i dodał jnotify.dll do projektHome\src\lib\ folderu. Ale niestety NetBeans jest overidning manifest.mf pliku.

Jak mogę naprawić? Czy mogę to zrobić używając tylko NetBeans? Czy to jest linia 'Bundle-NativeCode: /lib/jnotify.dll; osname=win32 poprawna? Słyszałem również, że powinienem umieścić hash biblioteki DLL w manifest.mf i podpisać mój słoik. Czy to prawda?

Odpowiedz

6

Nie sądzę, że plik wykonywalny Java obsługuje Bundle-NativeCode. Jestem prawie pewien, że jest to atrybut OSGi. Lista obsługiwanych atrybutów jest zdefiniowana w JAR File Specification.

Poza strukturami, które to zapewniają, nie ma wbudowanej obsługi łączenia bibliotek rodzimych wewnątrz plików JAR. Jeśli dobrze pamiętam, możliwe jest wyodrębnienie pliku do tymczasowej lokalizacji i załadowanie go ręcznie.

+0

Dzięki za odpowiedź. Myślę, że spróbuję go zawrzeć w exe. Mógłbym zrobić prosty plik wsadowy nietoperza, ale wolę mieć tylko jeden plik. Ale nie znalazłem jeszcze odpowiedniego narzędzia. Próbowałem Lunch4j, ale nie ma opcji dodawania rodzimych bibliotek. –

+0

Zawarłem plik dll w 'user.dir' i wszystko działało ładnie. – Jus12

3

Wpadłem na ten problem podczas próby zamknięcia zdarzenia zamknięcia systemu Windows, gdy program jest uruchamiany w tym systemie operacyjnym. Rozwiązaniem, z którego skorzystałem, było zasadniczo McDowell's - dodanie biblioteki DLL do pliku JAR i wyodrębnienie jej do tymczasowej lokalizacji, gdy program się uruchamia. Jeśli pasuje do twojego programu, możesz pozostawić bibliotekę DLL w bardziej trwałym miejscu, a następnie odnieść ją do kolejnych uruchomień programu. Moja aplikacja była używana w środowisku, w którym użytkownicy mogą celowo usuwać pliki, których nie powinni, więc musiałem wyodrębnić bibliotekę DLL przy każdym uruchomieniu. Nie spowodowało to jednak żadnego trafienia wydajnościowego.

+2

Masz dowolny fragment kodu do tego? –

+0

Zobacz http: // stackoverflow.com/a/4691879/116509 – artbristol

6

Czasami okazało się, że problem nie jest sposobem Java ładowania natywnych bibliotek, ale biblioteką stron trzecich, która wymaga tego natywnego kodu.

Problemem jest to, że 3rd bibliotekami strona będzie zrobić w pewnym momencie (zazwyczaj bardzo wcześnie w inicjalizacji)

System.loadLibrary("native.dll"); 

A jeśli native.dll nie jest na appropiated miejsce zgłasza błąd.

Jeśli masz dostęp do źródła java biblioteki trzeciej, łatwa może być łatka tego kodu i możesz łatwo wydobyć bibliotekę dll z JAR i uruchomić System.load przed użyciem lib innej firmy.

Aktualizacja Zajrzałem do źródeł JNotify. To jest dokładnie to, co powiedział:

public class JNotify_win32 
{ 
    static 
    { 
     System.loadLibrary("jnotify"); /* *** */ 
     int res = nativeInit(); 
     if (res != 0) 
     { 
      throw new RuntimeException("Error initialiing native library. (#" + res + ")"); 
     } 
    } 

linia Weź *** lub otoczyć się z try-catch, obciążenia z System.load() i gotowe.

+0

Dobrze, ale myślę, że to nie jest problem w moim przypadku: "Aby użyć JNotify, musisz mieć bibliotekę macierzystą (jnotify.dll lub jnotify.so) w twoim java.library.path Aby to zrobić, musisz użyć parametru -Djava.library.path podczas uruchamiania aplikacji java, na przykład: java -cp jnotify.jar -Djava.library.path =. " –

+0

Wielkie dzięki. Masz 100% racji. Myślałem o stworzeniu nietoperza i pomyślałem, że zmiana lokalizacji biblioteki DLL powinna stanowić problem. Kiedy przeczytałem twoją odpowiedź, pomyślałem: "Sprawdziłem, mogę zrobić wszystko z moim del", ale sprawdzałem zupełnie inną rzecz. Muszę być zmęczony. –

Powiązane problemy