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

SmokeBuster bekämpft SmokeLoader

Malware SmokeLoader wird weiterhin von Bedrohungsakteuren genutzt, um Payloads über neue C2-Infrastrukturen zu verbreiten.

5 Stunden ago

Taugen Kryptowährungen als Unterstützer der Energiewende?

Bankhaus Metzler und Telekom-Tochter MMS testen, inwieweit Bitcoin-Miner das deutsche Stromnetz stabilisieren könnten.

21 Stunden ago

Supercomputer-Ranking: El Capitan überholt Frontier und Aurora

Mit 1,7 Exaflops ist El Capitan nun der dritte Exascale-Supercomputer weltweit. Deutschland stellt erneut den…

1 Tag ago

Ionos führt neue AMD-Prozessoren ein

Der deutsche Hyperscaler erweitert sein Server-Portfolio um vier Angebote mit den neuen AMD EPYC 4004…

1 Tag ago

Lags beim Online-Gaming? DSL-Vergleich und andere Tipps schaffen Abhilfe

Beim Online-Gaming kommt es nicht nur auf das eigene Können an. Auch die technischen Voraussetzungen…

1 Tag ago

GenKI-Fortbildung immer noch Mangelware

Fast jedes zweite Unternehmen bietet keinerlei Schulungen an. In den übrigen Betrieben profitieren oft nur…

1 Tag ago