<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.byte-welt.net/index.php?action=history&amp;feed=atom&amp;title=JNI</id>
	<title>JNI - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.byte-welt.net/index.php?action=history&amp;feed=atom&amp;title=JNI"/>
	<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=JNI&amp;action=history"/>
	<updated>2026-08-10T20:19:16Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Byte-Welt Wiki</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=JNI&amp;diff=3924&amp;oldid=prev</id>
		<title>Eagleeye: Die Seite wurde neu angelegt: Java Native Interface (JNI) ist eine Technik für Java um aus einem Java-Programm andere Sprachen wie C oder C++ aufzurufen. Die zu verwendenden Element...</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=JNI&amp;diff=3924&amp;oldid=prev"/>
		<updated>2009-02-17T09:38:20Z</updated>

		<summary type="html">&lt;p&gt;Die Seite wurde neu angelegt: Java Native Interface (JNI) ist eine Technik für &lt;a href=&quot;/index.php/Java&quot; class=&quot;mw-redirect&quot; title=&quot;Java&quot;&gt;Java&lt;/a&gt; um aus einem Java-&lt;a href=&quot;/index.php?title=Programm&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Programm (Seite nicht vorhanden)&quot;&gt;Programm&lt;/a&gt; andere Sprachen wie &lt;a href=&quot;/index.php?title=C&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;C (Seite nicht vorhanden)&quot;&gt;C&lt;/a&gt; oder &lt;a href=&quot;/index.php?title=C%2B%2B&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;C++ (Seite nicht vorhanden)&quot;&gt;C++&lt;/a&gt; aufzurufen. Die zu verwendenden Element...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Java Native Interface (JNI) ist eine Technik für [[Java]] um aus einem Java-[[Programm]] andere Sprachen wie [[C]] oder [[C++]] aufzurufen. Die zu verwendenden Elemente der Sprache müssen als [[dynamische Bibliothek]] (dll) vorliegen, damit Java auf sie zugreifen kann. Außerdem muss eine von Java generierte [[Header Datei]] implementiert werden.&lt;br /&gt;
&lt;br /&gt;
==Ablauf==&lt;br /&gt;
Zu erst wird der Javacode geschrieben, jede Methode die auf eine native Methode zugreifen soll wird dazu mit dem Schlüsselwort &amp;#039;&amp;#039;native&amp;#039;&amp;#039; versehen:&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
package de.eagleside.util.application;&lt;br /&gt;
public class WindowsApplication&lt;br /&gt;
{&lt;br /&gt;
  public native String getUserSaveDir();&lt;br /&gt;
&lt;br /&gt;
  public native String getSystemSaveDir();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
Aus dieser Klasse wird jetzt eine Header Datei generiert&lt;br /&gt;
 javah -o WindowsApplication.h de.eagleside.util.application.WindowsApplication&lt;br /&gt;
&lt;br /&gt;
Mit dieser Header Datei wird jetzt ein C++ Projekt gestartet und die dafür nötige Implementierung geschrieben. Für das Projekt müssen noch zwei Include und ein Lib Pfad hinzugefügt werden&lt;br /&gt;
 &amp;lt;Pfad zum JDK&amp;gt;/include&lt;br /&gt;
 &amp;lt;PFAD zum JDK&amp;gt;/include/win32&lt;br /&gt;
 &amp;lt;PFAD zum JDK&amp;gt;/lib&lt;br /&gt;
&lt;br /&gt;
Jetzt folgt die Implementierung der Methoden, hier kann auch auf andere Objekt oder Bibliotheken zugegriffen werden.&lt;br /&gt;
&amp;lt;code=cpp&amp;gt;&lt;br /&gt;
#include &amp;lt;shlobj.h&amp;gt;&lt;br /&gt;
#include &amp;quot;WindowsInfos.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Gibt den Pfad zurück, unter dem der Benutzer seine Daten speichern soll.&lt;br /&gt;
 */&lt;br /&gt;
JNIEXPORT jstring JNICALL Java_de_eagleside_util_application_WindowsApplication_getUserSaveDir&lt;br /&gt;
  (JNIEnv * env, jobject){&lt;br /&gt;
	TCHAR path[255];&lt;br /&gt;
	SHGetFolderPath( NULL, CSIDL_LOCAL_APPDATA, &lt;br /&gt;
				 NULL, 0, path );&lt;br /&gt;
	return env-&amp;gt;NewStringUTF(path);&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Gibt den Pfad zurück, unter dem die Daten für das System speichert werden soll.&lt;br /&gt;
 */&lt;br /&gt;
JNIEXPORT jstring JNICALL Java_de_eagleside_util_application_WindowsApplication_getSystemSaveDir&lt;br /&gt;
(JNIEnv *env, jobject){	&lt;br /&gt;
	TCHAR path[255];&lt;br /&gt;
	SHGetFolderPath( NULL, CSIDL_COMMON_APPDATA, &lt;br /&gt;
				 NULL, 0, path );&lt;br /&gt;
	return env-&amp;gt;NewStringUTF(path);&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ist die Implementierung abgeschlossen wird alles als dll erzeugt, hier wurde sie &amp;#039;&amp;#039;&amp;#039;Application.dll&amp;#039;&amp;#039;&amp;#039; genannt. Unter Eclipse kann diese DLL einfach in das Projekt kopiert werden damit sie beim nächsten Start gefunden wird. In die &amp;#039;&amp;#039;WindowsApplication&amp;#039;&amp;#039; Klasse muss nur noch eine Erweiterung eingetragen werden.&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
  static&lt;br /&gt;
  {&lt;br /&gt;
    System.loadLibrary(&amp;quot;Application&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
Damit wird die Bibliothek einmal geladen und kann verwendet werden.&lt;br /&gt;
&lt;br /&gt;
==Umbegung==&lt;br /&gt;
Jeder Methodenaufruf aus Java wird in eine C Methode umgewandelt, diese Methoden haben immer zwei Parameter. Der erste ist der &amp;#039;&amp;#039;JNIEnv&amp;#039;&amp;#039;, ein Pointer auf die JNI Umgebung, mit ihm lassen sich Java Datentypen erstellen oder Exceptions werfen. Der zweite Parameter ist &amp;#039;&amp;#039;jobject&amp;#039;&amp;#039;, welcher das aufrufende Java-Objekt repräsentiert, somit lässt sich auf Element des Objekts zugreifen.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Java]]&lt;br /&gt;
[[Kategorie:JNI]]&lt;br /&gt;
[[Kategorie:Tutorials (Java)]]&lt;/div&gt;</summary>
		<author><name>Eagleeye</name></author>
	</entry>
</feed>