Home > Code > Java > Native Bibliotheken

Native Bibliotheken

Geschrieben von admin on November 25, 2008

Zu den großen Rätseln unserer Zeit zählt ja immer noch das Verwenden von nativem Code, also kompiliereten C-Bibliotheken in Java. Jeder weiß natürlich, dass man sie irgendwie mit System.loadLibrary(..) läd, aber wie nun genau?

 

public static void main(String[] args) {
  	try {
		System.loadLibrary("sqlite_jni");
	} catch (Throwable e) {
		Logger.getLogger(Main.class).error("Native Libraries not found",e);
		System.exit(1);
	}
	new Frame();
}

Wichtig ist, dass die Bibliotheken nur einmal geladen werden, also loadLibrary(.. ) in einem Programm nur einmal aufgerufen wird. Daher eine Stelle finden, die aller Voraussicht nach nur einmal durchlaufen wird.

Unsere Library heißt hier: sqlite_jni, daher heißen die Dateien unter Windows: sqlite_jni.dll und unter Linux: libsqlite_jni.so. Dies wird von der jeweiligen VM automatisch umgesetzt, wir brauchen hier nichts weiter zu tun. Nun gilt es sicherzustellen, dass die Java-VM die Bibliothek auch findet.

Hier gelten zunächst einmal die Regeln des jeweiligen Betriebssystems, d.h. die Bibliothek muss in einem Verzeichnis liegen, auf das die PATH Umgebungsvariable zeigt. Das kann beispielsweise das Windows oder windows/system Verzeichnis sein, oder auch das aktuelle Verzeichnis, aus dem das Java Programm ausgeführt wird. Aber Vorsicht: das aktuelle Verzeichnis gehört nicht immer und auf jedem System zum Suchpfad. Hier besteht die Gefahr, dass die Bibliothek nicht gefunden wird.

Möglicherweise möchten wir die Bibliothek ja auch nicht in dem Pfad haben, aus dem das Javaprogramm gestartet wird, sondern in einem Unterverzeichnis. Versuche, eine Library mit (relativer) Pfadangabe zu laden werden aber von der Java-VM meist zurückgewiesen: System.loadLibrary("lib/sqlite_jni") geht mit Java 5 unter Windows XP, wird aber unter Ubuntu Linux zurückgewiesen und führt zum Fehler.

Die PATH Umgebungsvariable kann in der Regel von einem kleinen Script vor dem Start unseres Javaprogramms gesetzt werden; allerdings ist hier die Syntax abhängig vom Betriebssystem; entsprechend aufwändig kann das Testen werden ;-)

Das ist es dann schon besser, sich auf Java-Mittel zu verlassen; dasselbe wie PATH für's Betriebssystem leistet das Java System-Property "java.library.path". Sie läßt sich zwar zur Laufzeit durch das Programm selbst setzen (System.setProperty("java.library.path","./lib")), allerdings hat dies keine Wirkung mehr. Maßgeblich ist der Wert, der beim Start des Programms an die Java-VM übergeben wurde:

java -Djava.library.path=./lib -jar pss.jar

immerhin lassen sich hier dann aber auch relative Pfadangaben verwenden.

Wir müssen also auch hier unser Javaprogramm mittels einer Scriptdatei starten, das Doppelklicken der Jar - Dateien unter Windows ist im Zusammenhang mit nativen Bibliotheken nicht möglich. Wer den Doppelklick dennoch braucht, dem bleibt nur, beispielsweise mit Launch4j einen Start-Wrapper zu bauen. Der kann dann sogar ein Icon haben und bindet die Bibliotheken korrekt ein.

Comments:

Sie müssen angemeldet sein um eine Nachricht zu erstellen. Anmelden »

Tags