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

Studie: Ein Drittel aller E-Mails an Unternehmen sind unerwünscht

Der Cybersecurity Report von Hornetsecurity stuft 2,3 Prozent der Inhalte gar als bösartig ein. Die…

2 Tagen ago

HubPhish: Phishing-Kampagne zielt auf europäische Unternehmen

Die Hintermänner haben es auf Zugangsdaten zu Microsoft Azure abgesehen. Die Kampagne ist bis mindestens…

3 Tagen ago

1. Januar 2025: Umstieg auf E-Rechnung im B2B-Geschäftsverkehr

Cloud-Plattform für elektronische Beschaffungsprozesse mit automatisierter Abwicklung elektronischer Rechnungen.

3 Tagen ago

Google schließt schwerwiegende Sicherheitslücken in Chrome 131

Mindestens eine Schwachstelle erlaubt eine Remotecodeausführung. Dem Entdecker zahlt Google eine besonders hohe Belohnung von…

3 Tagen ago

Erreichbarkeit im Weihnachtsurlaub weiterhin hoch

Nur rund die Hälfte schaltet während der Feiertage komplett vom Job ab. Die anderen sind…

4 Tagen ago

Hacker missbrauchen Google Calendar zum Angriff auf Postfächer

Security-Experten von Check Point sind einer neuen Angriffsart auf die Spur gekommen, die E-Mail-Schutzmaßnahmen umgehen…

5 Tagen ago