21.2 Eine C-Funktion in ein Java-Programm einbinden
Wir wollen in einem kurzen Überblick sehen, wie die Vorgehensweise prinzipiell ist. Dazu werfen wir einen Blick auf die Implementierung einer einfachen Klasse, die lediglich die Länge der Zeichenkette berechnet.
21.2.1 Den Java-Code schreiben
Zunächst benötigen wir eine Klasse mit einer nativen Java-Methode. Wir haben gesehen, dass dafür der Modifizierer native nötig ist. Die Methode besitzt – wie eine abstrakte Methode – keine Implementierung.
public static native int strlen( String s );
Die statische Methode soll in eine Klasse mit einem statischen Initialisierungsblock eingebettet werden, der die dynamische Bibliothek lädt:
Listing 21.1: com/tutego/jni/StrLen.java
package com.tutego.jni;
public class StrLen
{
static
{
System.loadLibrary( "strlen" );
}
public static native int strlen( String s );
}
Die statische Methode System.loadLibrary() delegiert an Runtime.getRuntime().loadLibrary(), die wir auch hätten nutzen können. Der Name der Bibliothek, "strlen", hat nichts mit dem Namen der Methode zu tun.
Eine Beispielklasse soll lediglich unsere statische Methode aufrufen:
Listing 21.2: com/tutego/jni/StrLenDemo.java
package com.tutego.jni;
public class StrLenDemo
{
public static void main( String[] args )
{
System.out.println( StrLen.strlen("2003 UB313") );
}
}
Suchort der dynamischen Bibliothek
Um bei der Aufforderung mit loadLibrary() die dynamische Bibliothek zu finden, wertet die Laufzeitumgebung die Umgebungsvariable LD_LIBRARY_PATH aus. Diese muss unter Umständen noch gesetzt werden. Befinden wir uns im selben Verzeichnis, ist das nicht nötig.
Welche Pfade die Laufzeitumgebung durchsucht, zeigt die folgende einfache Zeile:
System.out.println( System.getProperty("java.library.path") );
Eine Alternative zu System.loadLibrary(String) ist die statische Methode System.load(String). Im Gegensatz zu loadLibrary() erwartet load() einen absoluten Pfad zur Bibliothek.
Ihr Kommentar
Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.