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
Der Cybersecurity Report von Hornetsecurity stuft 2,3 Prozent der Inhalte gar als bösartig ein. Die…
Die Hintermänner haben es auf Zugangsdaten zu Microsoft Azure abgesehen. Die Kampagne ist bis mindestens…
Cloud-Plattform für elektronische Beschaffungsprozesse mit automatisierter Abwicklung elektronischer Rechnungen.
Mindestens eine Schwachstelle erlaubt eine Remotecodeausführung. Dem Entdecker zahlt Google eine besonders hohe Belohnung von…
Nur rund die Hälfte schaltet während der Feiertage komplett vom Job ab. Die anderen sind…
Security-Experten von Check Point sind einer neuen Angriffsart auf die Spur gekommen, die E-Mail-Schutzmaßnahmen umgehen…