25 styczeń 2009

UnsatisfiedLinkError na Mac OS X

Na Mac OS X od czasu do czasu nie działa coś zwiazanego z Javą 6. W zasadzie to nie mam pojęcia dlaczego Apple zajmuje się implementacją Javy, a nie Sun jak na pozostałaych systemach. Jakiś czas temu chciałem uruchomić aplikację korzystającą z zewnętrzenej biblioteki. Aplikacja ta umożliwia komunikację z urządzeniami przez port RS232. Mimo różnych kombinacji ciągle program nie widział wymaganej biblioteki:

java.lang.UnsatisfiedLinkError: /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Libraries/librxtxSerial.jnilib: thrown while loading gnu.io.RXTXCommDriver
Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Libraries/librxtxSerial.jnilib:
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1822)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1723)
at java.lang.Runtime.loadLibrary0(Runtime.java:822)
at java.lang.System.loadLibrary(System.java:993)
at gnu.io.CommPortIdentifier.(CommPortIdentifier.java:83)
at eu.gruchala.rs232.ListAvailablePorts.(ListAvailablePorts.java:23)
at eu.gruchala.rs232.MainFrame$1.run(MainFrame.java:77)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:176)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)

Okazało się, że problem leży w Javie 6 i Javie 5 64-bitowej. Nie wiem dlaczego, ale te wersje choćby nie wiem co, nie widzą zależnych bibliotek niejawowych. Aby program zadziałał, wystarczy przełączyć system na uruchomianie aplikacji z Javą 5 32-bity lub podłączyć bibliotekę skompilowaną na 64-bity. Powinna nazywać się libXXX.jnilib gdzie XXX to nazwa jaką ładujemy w kodzie programu np.:
System.loadLibrary("XXX");



0 komentarze: