JNI

Aus Byte-Welt Wiki
Zur Navigation springenZur Suche springen

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.

Ablauf

Zu erst wird der Javacode geschrieben, jede Methode die auf eine native Methode zugreifen soll wird dazu mit dem Schlüsselwort native versehen: <code=java> package de.eagleside.util.application; public class WindowsApplication {

 public native String getUserSaveDir();
 public native String getSystemSaveDir();

} </code=java> Aus dieser Klasse wird jetzt eine Header Datei generiert

javah -o WindowsApplication.h de.eagleside.util.application.WindowsApplication

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

<Pfad zum JDK>/include
<PFAD zum JDK>/include/win32
<PFAD zum JDK>/lib

Jetzt folgt die Implementierung der Methoden, hier kann auch auf andere Objekt oder Bibliotheken zugegriffen werden. <code=cpp>

  1. include <shlobj.h>
  2. include "WindowsInfos.h"

/**

* Gibt den Pfad zurück, unter dem der Benutzer seine Daten speichern soll.
*/

JNIEXPORT jstring JNICALL Java_de_eagleside_util_application_WindowsApplication_getUserSaveDir

 (JNIEnv * env, jobject){

TCHAR path[255]; SHGetFolderPath( NULL, CSIDL_LOCAL_APPDATA, NULL, 0, path ); return env->NewStringUTF(path);

}


/**

* Gibt den Pfad zurück, unter dem die Daten für das System speichert werden soll.
*/

JNIEXPORT jstring JNICALL Java_de_eagleside_util_application_WindowsApplication_getSystemSaveDir (JNIEnv *env, jobject){ TCHAR path[255]; SHGetFolderPath( NULL, CSIDL_COMMON_APPDATA, NULL, 0, path ); return env->NewStringUTF(path);

} </code=cpp>

Ist die Implementierung abgeschlossen wird alles als dll erzeugt, hier wurde sie Application.dll genannt. Unter Eclipse kann diese DLL einfach in das Projekt kopiert werden damit sie beim nächsten Start gefunden wird. In die WindowsApplication Klasse muss nur noch eine Erweiterung eingetragen werden. <code=java>

 static
 {
   System.loadLibrary("Application");
 }

</code=java> Damit wird die Bibliothek einmal geladen und kann verwendet werden.

Umbegung

Jeder Methodenaufruf aus Java wird in eine C Methode umgewandelt, diese Methoden haben immer zwei Parameter. Der erste ist der JNIEnv, ein Pointer auf die JNI Umgebung, mit ihm lassen sich Java Datentypen erstellen oder Exceptions werfen. Der zweite Parameter ist jobject, welcher das aufrufende Java-Objekt repräsentiert, somit lässt sich auf Element des Objekts zugreifen.