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

Google schließt Zero-Day-Lücke in Chrome

Von ihr geht ein hohes Risiko aus. Angreifbar sind Chrome für Windows, macOS und Linux.

1 Tag ago

KI erkennt Emotionen in echten Sportsituationen

Forschende des KIT haben ein Modell zur Emotionsanalyse entwickelt, das affektive Zustände ähnlich genau wie…

2 Tagen ago

Ermittlern gelingt weiterer Schlag gegen Ransomware-Gruppe LockBit

Sie decken die Identität des Kopfs der Gruppe auf. Britische Behörden fahnden mit einem Foto…

3 Tagen ago

Apple stellt neuen Mobilprozessor M4 vor

Er treibt das neue iPad Pro mit OLED-Display an. Apple verspricht eine deutliche Leistungssteigerung gegenüber…

4 Tagen ago

Cyberabwehr: Mindestens zwei kritische Vorfälle pro Tag

Davon entfällt ein Viertel auf staatliche Einrichtungen und 12 Prozent auf Industrieunternehmen.

4 Tagen ago

Tunnelvision: Exploit umgeht VPN-Verschlüsselung

Forscher umgehen die Verschlüsselung und erhalten Zugriff auf VPN-Datenverkehr im Klartext. Für ihren Angriff benötigen…

4 Tagen ago