tessarakt – das vierdimensionale B-L-O-G

2Feb/100

Native Libraries in Java

Java erlaubt das Einbinden "nativer" Bibliotheken (also .so bzw. .dll, C-Bibliotheken halt). Allerdings gibt es da einige Tücken: Die Bibliothek muß mit System.loadLibrary("name"); explizit geladen werden. Sie ist dann nur in dem Classloader verfügbar, mit dem sie geladen wurde. Das allein ist noch nicht weiter schlimm - allerdings läßt sich eine Bibliothek auch nur einmal laden. Und "einmal" heißt einmal: Einmal in der Lebenszeit der gesamten JVM. Da ist es auch egal, ob es den Classloader noch gibt etc.

Problematisch wird das zum Beispiel in einem Servlet-Container. Gegeben seien zwei Servlets A und B, die beide libname.so verwenden wollen. Das zweite Servlet, das die Lib laden will, bekommt dann einen UnsatisfiedLinkError. Ein im Netz vorgeschlagener Workaround ist, dafür zu sorgen, daß die Lib vom System-Classloader geladen wird. Hört sich etwas kompliziert an ... Eine etwas einfachere Möglichkeit, die auch prompt funktionierte: Einfach die Bibliothek verdoppeln (cp libname.so libname2.so), im zweiten Servlet System.loadLibrary("name2"); ausführen. Wenn die Libraries eh irgendwo lokal rumflattern, paßt das ...

hat dir dieser Artikel gefallen?

Dann abonniere doch diesen Blog per RSS Feed!

veröffentlicht unter: Informatik Kommentar schreiben
Kommentare (0) Trackbacks (0)

Zu diesem Artikel wurden noch keine Kommentare geschrieben.


Kommentar schreiben


Noch keine Trackbacks.