Fremdsprachen integrieren: So funktioniert das Java Native Interface

Entwickler nutzen das Java Native Interface (JNI), um native Methoden zu schreiben, falls eine Anwendung nicht vollständig in Java erstellt werden kann. Das ist etwa der Fall, wenn die Standardklassenbibliothek von Java nicht die plattformabhängigen Funktionen oder die Programmbibliothek unterstützt. Das JNI wird außerdem verwendet, um eine vorhandene Anwendung, die in einer anderen Programmiersprache geschrieben wurde, so zu modifizieren, dass sie für Java-Anwendungen zugänglich wird.

Viele Klassen der Standardbibliothek greifen auf das JNI zurück, um Entwicklern und Benutzern bestimmte Funktionen zur Verfügung zu stellen, zum Beispiel das Lesen von I/O-Dateien oder Soundfähigkeiten. Die Integration von performance- und plattformabhängigen API-Implementierungen in der Standardbibliothek ermöglicht allen Java-Anwendungen den sicheren und plattformunabhängigen Zugriff auf diese Funktionen. Ehe Entwickler direkt auf das JNI zugreifen, sollten sie sicherstellen, dass die gewünschte Funktionalität nicht schon in den Standardbibliotheken bereitgestellt wird.

So funktioniert das JNI

Im JNI werden native Funktionen in einer separaten .c– oder .cpp-Datei implementiert. C++ bietet eine etwas sauberere Schnittstelle zum JNI. Wenn die JVM die entsprechende Funktion aufruft, übergibt sie einen JNIEnv-Zeiger, einen jobject-Zeiger sowie alle Java-Argumente, die von der Java-Methode deklariert werden. Eine JNI-Funktion kann folgendermaßen aussehen:

Der env-Zeiger ist eine Struktur, die das Interface zur JVM einschließt. Er enthält alle für die Interaktion mit der JVM und die Arbeit mit Java-Objekten erforderlichen Funktionen. So konvertieren JNI-Funktionen beispielsweise native Arrays in Java-Arrays und wieder zurück. Ebenso wandeln sie native Strings in Java-Strings um und entsprechend wieder zurück, instantiieren Objekte oder lösen Ausnahmefehler aus. Im Prinzip kann man mit Hilfe von JNIEnv alles erledigen, was auch Java kann – wenn auch längst nicht so einfach.

Präziser gesagt: Nativer Code greift auf JVM-Features zu, indem er JNI-Funktionen aufruft, die über einen Interface-Zeiger zugänglich sind. Dieser Zeiger verweist auf ein Array von Zeigern, von denen jeder wiederum auf eine Interface-Funktion zeigt. Jede Interface-Funktion befindet sich an einer festgelegten Stelle des Arrays. Native Methoden übernehmen den JNI-Interface-Zeiger als Argument. Die JVM sorgt dafür, dass derselbe Interface-Zeiger an eine native Methode übergeben wird, wenn mehrere Aufrufe der nativen Methode von demselben Java-Thread erfolgen. Allerdings kann eine native Methode auch von unterschiedlichen Java-Threads aufgerufen werden und daher unterschiedliche JNI-Interface-Zeiger als Argument erhalten.

Page: 1 2

ZDNet.de Redaktion

Recent Posts

Microsoft steigert Umsatz und Gewinn im ersten Fiskalquartal

Das stärkste Wachstum verbucht die Cloud-Sparte. Microsoft verpasst bei der Umsatzprognose für das laufende Quartal…

9 Stunden ago

Bezahlkarten: Infineon verspricht weniger Plastikmüll

Ein Coil-on-Module-Package integriert Chip und Antenne, was den Kartenkörper fast vollständig recycelbar machen soll.

24 Stunden ago

Firefox 132 schließt elf Sicherheitslücken

Mindestens eine Anfälligkeit erlaubt das Einschleusen von Schadcode. Außerdem erweitern die Entwickler den Support für…

1 Tag ago

Telekom nennt Termin für 2G-Ende

Zum 30. Juni 2028 soll das 2G-Netz komplett abgeschaltet werden und den Weg für schnellere…

1 Tag ago

Alphabet übertrifft die Erwartungen im dritten Quartal

Gewinn und Umsatz legen deutlich zu. Zum Wachstum tragen auch die Sparten Cloud und Abonnements…

1 Tag ago

1 Million Dollar: Apple zahlt Prämie für Hack seiner Apple Intelligence Server

Ein neues Bug-Bounty-Programm beschäftigt sich mit Apples Private Cloud Compute. Prämien gibt es unter für…

2 Tagen ago