Fremdsprachen integrieren: So funktioniert das Java Native Interface

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

Das Argument für System.loadLibrary ist ein vom Programmierer beliebig gewählter Bibliotheksname. Das System geht nach einem standardmäßigen, plattformspezifischen Ansatz vor, um den Bibliotheksnamen in den Namen einer nativen Bibliothek zu konvertieren. So wandelt ein Solaris-System den Namen pkg_Cls beispielsweise in libpkg_Cls.so um, während ein Win32-System denselben Namen in pkg_Cls.dll umformt.

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

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

Zuordnung von Datentypen

Grundtypen wie Integer, Character und andere werden einfach zwischen Java und dem nativen Code kopiert. Sonstige Java-Objekte werden hingegen per Referenz übergeben.

Folgende Tabelle zeigt die Zuordnung von Datentypen zwischen Java und nativem Code. Diese Typen sind austauschbar. Man kann also jint anstatt int verwenden und umgekehrt, ohne dass dazu eine Typumwandlung erforderlich wäre.


Allerdings funktioniert die Zuordnung zwischen Java-Strings und
-Arrays und nativen Strings und Arrays anders. Falls man einen jstring verwendet, wo eigentlich ein char * erwartet wird, kann der Code die JVM zum Absturz bringen. Hier ein Beispiel, wie man korrekt mit Strings arbeitet:

Java-Objekte verarbeitet man immer mit dem Interface-Zeiger env.

Fazit

Es ist nicht besonders leicht, das JNI in einer eigenen Anwendung zu implementieren. Allerdings sprechen dessen Performance, die Fähigkeit zur Weiterverwendung von vorhandenem Code und die Möglichkeit, seine Java-Anwendung um zusätzliche Funktionen zu erweitern, durchaus dafür, sich dieser Herausforderung zu stellen. Weitere Informationen sind auf der JNI-Homepage zu finden.

Page: 1 2

ZDNet.de Redaktion

Recent Posts

Microsoft stellt kleines KI-Modell Phi-3 Mini vor

Seine Trainingsdaten umfassen 3,8 Milliarden Parameter. Laut Microsoft bietet es eine ähnliche Leistung wie OpenAIs…

3 Tagen ago

Google schließt kritische Sicherheitslücke in Chrome

Sie erlaubt eine Remotecodeausführung außerhalb der Sandbox. Betroffen sind Chrome für Windows, macOS und Linux.

3 Tagen ago

Microsoft beseitigt Fehler im März-Sicherheitsupdate für Exchange Server

Probleme treten vor allem bei Nutzern von Outlook Web Access auf. Das optionale Hotfix-Update für…

3 Tagen ago

Neue iPads: Apple kündigt Event für 7. Mai an

Die Einladung zeigt einen zeichnenden Apple Pencil. Der wiederum deutet auf neue iPads hin. Es…

3 Tagen ago

EU-Parlament stimmt für Recht auf Reparatur

Die Richtlinie erhält 584 Ja-Stimmen und 3 Gegenstimmen. Das „Recht auf Reparatur“ beinhaltet unter bestimmten…

4 Tagen ago

Forscher entwickeln Exploits per GPT-4 aus Sicherheitswarnungen

Die Tests basieren auf tatsächlich existierenden Sicherheitslücken. GPT-4 erreicht eine Erfolgsquote von 87 Prozent. Alle…

4 Tagen ago