{"id":625,"date":"2025-09-13T13:11:44","date_gmt":"2025-09-13T12:11:44","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=625"},"modified":"2025-10-01T13:13:30","modified_gmt":"2025-10-01T12:13:30","slug":"einfuehrung-in-java-native-interface-jni","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=625","title":{"rendered":"Einf\u00fchrung in Java Native Interface (JNI)"},"content":{"rendered":"\n<p>Java ist bekannt f\u00fcr seine Plattformunabh\u00e4ngigkeit. Der Java-Code wird in Bytecode kompiliert, der auf jeder Maschine mit einer Java Virtual Machine (JVM) ausgef\u00fchrt werden kann. Dennoch gibt es Situationen, in denen man auf <strong>natives Code<\/strong>, also auf Code in Sprachen wie C oder C++, zugreifen muss. Gr\u00fcnde daf\u00fcr k\u00f6nnen sein:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Zugriff auf Hardware oder spezielle Betriebssystemfunktionen<\/li>\n\n\n\n<li>Nutzung bestehender Bibliotheken, die nur in C\/C++ verf\u00fcgbar sind<\/li>\n\n\n\n<li>Performancekritische Operationen, die in Java schwer effizient umzusetzen sind<\/li>\n<\/ul>\n\n\n\n<p>Hier kommt <strong>JNI \u2013 Java Native Interface<\/strong> ins Spiel. JNI ist eine Schnittstelle, die es erm\u00f6glicht, Java-Code mit nativen Programmen zu verbinden.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Grundlagen von JNI<\/strong><\/h2>\n\n\n\n<p>JNI definiert einen Mechanismus, \u00fcber den Java-Programme native Funktionen aufrufen k\u00f6nnen. Diese Funktionen werden in der Regel in C oder C++ implementiert. Das Grundprinzip ist:<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>Java-Code deklariert native Methoden, die nicht in Java implementiert sind.<\/li>\n\n\n\n<li>Der Compiler erstellt Header-Dateien f\u00fcr die nativen Methoden.<\/li>\n\n\n\n<li>Entwickler implementieren die Methoden in C\/C++.<\/li>\n\n\n\n<li>Die JVM l\u00e4dt zur Laufzeit die native Bibliothek und f\u00fchrt die Funktionen aus.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Beispiel: Native Methode deklarieren<\/strong><\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">NativeExample<\/span> <\/span>{\n    <span class=\"hljs-comment\">\/\/ Deklaration der nativen Methode<\/span>\n    <span class=\"hljs-keyword\">public<\/span> native int addNumbers(int a, int b);\n\n    <span class=\"hljs-keyword\">static<\/span> {\n        <span class=\"hljs-comment\">\/\/ Laden der nativen Bibliothek<\/span>\n        System.loadLibrary(<span class=\"hljs-string\">\"NativeLib\"<\/span>);\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> void main(String&#91;] args) {\n        NativeExample example = <span class=\"hljs-keyword\">new<\/span> NativeExample();\n        int result = example.addNumbers(<span class=\"hljs-number\">5<\/span>, <span class=\"hljs-number\">7<\/span>);\n        System.out.println(<span class=\"hljs-string\">\"Ergebnis: \"<\/span> + result);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In diesem Beispiel wird die Methode addNumbers in Java nur deklariert, nicht implementiert. Die Implementierung erfolgt in einer nativen Bibliothek, die sp\u00e4ter mit System.loadLibrary geladen wird.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Erzeugen der Header-Datei<\/strong><\/h2>\n\n\n\n<p>Um die Schnittstelle zwischen Java und C\/C++ zu definieren, erzeugt man mit dem Java-Compiler eine Header-Datei:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">javac<\/span> <span class=\"hljs-selector-tag\">NativeExample<\/span><span class=\"hljs-selector-class\">.java<\/span>\n<span class=\"hljs-selector-tag\">javah<\/span> <span class=\"hljs-selector-tag\">-jni<\/span> <span class=\"hljs-selector-tag\">NativeExample<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Der Befehl javah erzeugt eine C-Header-Datei mit Signaturen der nativen Methoden. Die Header-Datei k\u00f6nnte so aussehen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">\/* DO NOT EDIT THIS FILE - it is machine generated *\/<\/span>\n<span class=\"hljs-comment\">#include &lt;jni.h&gt;<\/span>\n<span class=\"hljs-comment\">\/* Header for class NativeExample *\/<\/span>\n\n<span class=\"hljs-comment\">#ifndef _Included_NativeExample<\/span>\n<span class=\"hljs-comment\">#define _Included_NativeExample<\/span>\n<span class=\"hljs-comment\">#ifdef __cplusplus<\/span>\nextern <span class=\"hljs-string\">\"C\"<\/span> {\n<span class=\"hljs-comment\">#endif<\/span>\n<span class=\"hljs-comment\">\/*\n * Class:     NativeExample\n * Method:    addNumbers\n * Signature: (II)I\n *\/<\/span>\nJNIEXPORT jint JNICALL Java_NativeExample_addNumbers\n  (JNIEnv *, jobject, jint, jint);\n\n<span class=\"hljs-comment\">#ifdef __cplusplus<\/span>\n}\n<span class=\"hljs-comment\">#endif<\/span>\n<span class=\"hljs-comment\">#endif<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Implementierung der nativen Methode<\/strong><\/h2>\n\n\n\n<p>Die eigentliche Implementierung erfolgt in C oder C++. Beispiel:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">#include \"NativeExample.h\"<\/span>\n\nJNIEXPORT jint JNICALL Java_NativeExample_addNumbers\n  (JNIEnv *env, jobject obj, jint a, jint b) {\n    <span class=\"hljs-keyword\">return<\/span> a + b;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Hierbei:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>JNIEnv *env ist ein Zeiger auf die JNI-Umgebung, \u00fcber die viele Operationen m\u00f6glich sind, z.\u202fB. Zugriff auf Java-Objekte.<\/li>\n\n\n\n<li>jobject obj ist eine Referenz auf das aufrufende Java-Objekt.<\/li>\n\n\n\n<li>jint entspricht dem Java-Datentyp int.<\/li>\n<\/ul>\n\n\n\n<p>Nach der Kompilierung entsteht eine native Bibliothek (.dll auf Windows, .so auf Linux, .dylib auf macOS), die von der JVM geladen werden kann.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>JNI Datentypen<\/strong><\/h2>\n\n\n\n<p>JNI definiert spezielle Datentypen, die Java-Datentypen entsprechen:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><strong>Java-Typ<\/strong><\/th><th><strong>JNI-Typ<\/strong><\/th><\/tr><\/thead><tbody><tr><td>int<\/td><td>jint<\/td><\/tr><tr><td>boolean<\/td><td>jboolean<\/td><\/tr><tr><td>byte<\/td><td>jbyte<\/td><\/tr><tr><td>char<\/td><td>jchar<\/td><\/tr><tr><td>short<\/td><td>jshort<\/td><\/tr><tr><td>long<\/td><td>jlong<\/td><\/tr><tr><td>float<\/td><td>jfloat<\/td><\/tr><tr><td>double<\/td><td>jdouble<\/td><\/tr><tr><td>Object<\/td><td>jobject<\/td><\/tr><tr><td>String<\/td><td>jstring<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Die JNI-Typen sind wichtig, da sie die Kompatibilit\u00e4t zwischen Java und C\/C++ sicherstellen.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Arbeiten mit Objekten in JNI<\/strong><\/h2>\n\n\n\n<p>JNI erlaubt nicht nur primitive Datentypen zu \u00fcbergeben, sondern auch komplexe Objekte. \u00dcber JNIEnv lassen sich Objekte manipulieren:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Felder lesen und schreiben<\/strong>: GetIntField, SetObjectField<\/li>\n\n\n\n<li><strong>Methoden aufrufen<\/strong>: CallObjectMethod, CallIntMethod<\/li>\n\n\n\n<li><strong>Arrays bearbeiten<\/strong>: GetIntArrayElements, ReleaseIntArrayElements<\/li>\n<\/ul>\n\n\n\n<p>Beispiel: Einen Java-String in C auslesen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">JNIEXPORT void JNICALL Java_NativeExample_printString\n  (JNIEnv *env, jobject obj, jstring jstr) {\n    <span class=\"hljs-keyword\">const<\/span> char *str = (*env)-&gt;GetStringUTFChars(env, jstr, <span class=\"hljs-number\">0<\/span>);\n    printf(<span class=\"hljs-string\">\"Java String: %s\\n\"<\/span>, str);\n    (*env)-&gt;ReleaseStringUTFChars(env, jstr, str);\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Hierbei muss der Speicher f\u00fcr den C-String wieder freigegeben werden, um Speicherlecks zu vermeiden.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Vorteile und Nachteile von JNI<\/strong><\/h2>\n\n\n\n<p><strong>Vorteile:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Zugriff auf systemnahe Funktionen und Hardware<\/li>\n\n\n\n<li>Nutzung bestehender Bibliotheken<\/li>\n\n\n\n<li>Performancekritische Operationen in C\/C++<\/li>\n<\/ul>\n\n\n\n<p><strong>Nachteile:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Komplexit\u00e4t und h\u00f6here Fehleranf\u00e4lligkeit<\/li>\n\n\n\n<li>Plattformabh\u00e4ngigkeit durch native Bibliotheken<\/li>\n\n\n\n<li>Speicher- und Ressourcenkontrolle muss manuell erfolgen<\/li>\n<\/ul>\n\n\n\n<p>JNI sollte daher gezielt eingesetzt werden, wenn Java alleine nicht ausreicht.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Fazit<\/strong><\/h2>\n\n\n\n<p>JNI ist ein m\u00e4chtiges Werkzeug, um die Grenzen von Java zu erweitern. Es erlaubt:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Integration von nativen Bibliotheken<\/li>\n\n\n\n<li>Zugriff auf Betriebssystemfunktionen<\/li>\n\n\n\n<li>Optimierung performancekritischer Abschnitte<\/li>\n<\/ul>\n\n\n\n<p>Dabei ist es entscheidend, den Umgang mit JNI sauber zu gestalten, um Speicherlecks, Abst\u00fcrze oder unvorhersehbares Verhalten zu vermeiden. F\u00fcr die meisten Anwendungsf\u00e4lle reicht reines Java, aber in speziellen Szenarien ist JNI unverzichtbar.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Java ist bekannt f\u00fcr seine Plattformunabh\u00e4ngigkeit. Der Java-Code wird in Bytecode kompiliert, der auf jeder Maschine mit einer Java Virtual Machine (JVM) ausgef\u00fchrt werden kann. Dennoch gibt es Situationen, in denen man auf natives Code, also auf Code in Sprachen wie C oder C++, zugreifen muss. Gr\u00fcnde daf\u00fcr k\u00f6nnen sein: Hier kommt JNI \u2013 Java [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-625","post","type-post","status-publish","format-standard","hentry","category-plain_java"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/625","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=625"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/625\/revisions"}],"predecessor-version":[{"id":626,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/625\/revisions\/626"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=625"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=625"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=625"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}