So funktioniert das Java Native Interface

Im JNI werden native Funktionen als separate .c- oder .cpp-Dateien implementiert. (C++ bietet eine etwas sauberere Schnittstelle zum JNI). Wenn die JVM die entsprechende Funktion aufruft, übergibt sie einen JNIEnv-Pointer, einen jobject-Pointer sowie alle Java-Argumente, die von der Java-Methode deklariert wurden. Eine JNI-Funktion könnte etwa so aussehen:

Der env-Pointer ist eine Struktur, welche die Schnittstelle zur JVM enthält. Er weist alle erforderlichen Funktionen für die Interaktion mit der JVM sowie zur Arbeit mit Java-Objekten auf. So konvertieren JNI-Funktionen beispielsweise native Arrays oder Strings in Java-Arrays beziehungsweise -Strings und umgekehrt, instantiieren Objekte, lösen Ausnahmefehler aus und so weiter. Im Prinzip kann man JNIEnv für alles verwenden, was auch Java kann, wenn auch nicht ganz so einfach.

Etwas formeller ausgedrückt: Nativer Code greift auf Features der JVM zu, indem er JNI-Funktionen aufruft, welche über einen Interfacepointer zugänglich sind (das ist ein Pointer auf einen Pointer). Dieser Pointer zeigt auf ein Array von Pointern, von denen jeder auf eine Interfacefunktion zeigt. Jede Interfacefunktion findet sich an einem vorgegebenen Offset innerhalb des Arrays. Native Methoden übernehmen den JNI-Interfacepointer als Argument. Die JVM sorgt dafür, dass immer derselbe Interfacepointer an eine native Methode übergeben wird, wenn sie diese native Methode mehrfach vom selben Java-Thread aus aufruft. Allerdings kann eine native Methode auch von unterschiedlichen Java-Threads aufgerufen werden, so dass sie unterschiedliche JNI-Interfacepointer erhält.

Native Methoden werden mit der Methode System.loadLibrary geladen. Im folgenden Beispiel lädt die Klasseninitialisierungsmethode eine plattformspezifische native Bibliothek, in welcher die native Method f definiert ist:

Das Argument für System.loadLibrary ist ein vom Programmierer gewählter beliebiger Bibliotheksname. Das System folgt einem standardmäßigen, plattformspezifischen Ansatz zur Konvertierung des Bibliotheksnamens in einen nativen Bibliotheksnamen. So konvertiert ein Solaris-System etwa den Namen pkg_Cls in libpkg_Cls.so, während ein Win32-System denselben Namen in pkg_Cls.dll umwandelt.

Dynamische Linker lösen Einträge anhand ihres Namens auf. Der Name einer nativen Methode wird dabei aus einzelnen Komponenten zusammengesetzt: dem Präfix Java_, einem verkürzten vollständig qualifizierten Klassennamen sowie einen verkürzten Methodennamen.

Hinweis: Microsofts JVM-Implementierung verfügt über einen ähnlichen Mechanismus zum Aufruf von nativem Windows-Code von Java aus, das RNI (Raw Native Interface).

Page: 1 2 3

ZDNet.de Redaktion

Recent Posts

Netzwerk-Portfolio für das KI-Zeitalter

Huawei stellt auf der Connect Europe 2024 in Paris mit Xinghe Intelligent Network eine erweiterte…

1 Tag ago

Internet-Tempo in Deutschland: Viel Luft nach oben

Höchste Zeit für eine schnelle Kupfer-Glas-Migration. Bis 2030 soll in Deutschland Glasfaser flächendeckend ausgerollt sein.

1 Tag ago

Erste Entwickler-Preview von Android 16 verfügbar

Schon im April 2025 soll Android 16 den Status Plattformstabilität erreichen. Entwicklern gibt Google danach…

1 Tag ago

Kaspersky warnt vor Cyberangriff auf PyPI-Lieferkette

Die Hintermänner setzen KI-Chatbot-Tools als Köder ein. Opfer fangen sich den Infostealer JarkaStealer ein.

2 Tagen ago

Digitale Produkte „cyberfit“ machen

Vernetzte Produkte müssen laut Cyber Resilience Act über Möglichkeiten zur Datenverschlüsselung und Zugangsverwaltung verfügen.

2 Tagen ago

Google schließt schwerwiegende Sicherheitslücken in Chrome 131

Das jüngste Update für Windows, macOS und Linux stopft drei Löcher. Eine Anfälligkeit setzt Nutzer…

2 Tagen ago