1 / 20

Java Native Interface Eine Einführung anhand eines praktischen Beispiels

Java Native Interface Eine Einführung anhand eines praktischen Beispiels. Fachseminar WS 09 Cornelius Zühl. Initialisieren der VM Windows. Unix. Jeder verwendet JNI 1 (der Java Programme nutzt). Jeder verwendet JNI 2 (der Java Programme schreibt).

mason
Download Presentation

Java Native Interface Eine Einführung anhand eines praktischen Beispiels

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Java Native InterfaceEine Einführung anhand eines praktischen Beispiels Fachseminar WS 09 Cornelius Zühl

  2. Initialisieren der VM Windows Unix Jeder verwendet JNI 1(der Java Programme nutzt)

  3. Jeder verwendet JNI 2(der Java Programme schreibt) • Methoden des Java-Frameworks, z.B. aus „System“ verwenden JNI

  4. Das Schlüsselwort „native“, aber warum kann ICH es verwenden? 1 • Ein „echter“ und ein „scheinbarer“ Grund • Grund 1 • Steigerung der Geschwindigkeit • Einige Aufgaben der Java-Release werden nicht in derselben Weise wie optimierte C-Programme ausgeführt • Konkret • Kritische Stellen (z.B. innere Schleifen) auslagern und in einer Java-Shell wrappen um so den „Trick“ vor dem Benutzer zu verbergen

  5. Das Schlüsselwort „native“, aber warum kann ICH es verwenden? 2 • Ein „echter“ und ein „scheinbarer“ Grund • Grund 2 • Ermöglicht Zugang zu speziellen Fähigkeiten des Rechners / Betriebssystem (BS) • Anschluss an neue Peripheriegeräte / Steckkarten • Zugriff auf verschiedene Netztypen • Verwendung eines eindeutigen Merkmals des BS • Konkret • Erfassen von Echtzeitton über Mikrofon

  6. Das Schlüsselwort „native“, aber warum kann ICH es verwenden? 3 • Ein „echter“ und ein „scheinbarer“ Grund • Grund – Performancesteigerung • Grund – Spezielle Eigenheiten des BS verwenden

  7. Performancesteigerung als scheinbarer Grund • Wer echtzeitkritisch will, wird Alternativen verwenden • Viele zeitkritische Probleme ohnehin schon in der JVM nativ gelöst • Besser Energie auf gutes Design von Klassen und Methoden verwenden • Abstrakt und wieder verwendbar • Geschwindigkeit als letzter Schritt

  8. Nativ spricht Java • Erzeugen, untersuchen und ändern von Java Objekten (einschließlich Arrays und Strings) • Java Methoden aufrufen • Exceptions werfen und fangen • Klassen und Klasseninformationen laden • Typprüfung zur Laufzeit • Auch erzeugen einer VM über Invocation API möglich

  9. Ein Blick hinter die Kulissen 1 • Aufruf nativ  JVM über Interface Pointer • IP = Zeiger auf Zeiger auf Array von Funktionszeigern • Pro (Java)Aufruf-Thread ist IP garantiert gleich • Funktionszeiger an Vordefinierte Stellen im Array, genannt JNI Funktionen

  10. Ein Blick hinter die Kulissen 2 struct JNINativeInterface_ {  void *reserved0;  void *reserved1;  void *reserved2;  void *reserved3;  ... jfieldID (JNICALL *GetStaticFieldID)    (JNIEnv *env, jclass clazz, const char *name, const char *sig); … } struct JNIEnv_ {  const struct JNINativeInterface_ *functions; ... jfieldID GetStaticFieldID(jclass clazz, const char *name,    const char *sig) {    return functions->GetStaticFieldID(this,clazz,name,sig); } … }

  11. Ein Blick hinter die Kulissen 3 • Spezielle Namenskonvention für externe d.h. native deklarierte „Java“ Methoden • Auf nicht Java Seite erhalten Methoden immer zwei zusätzliche Argumente • Argument eins ist der JNI Interface Pointer • Argument zwei ist bei static native Methoden • Zeiger auf Java-Klasse in JVM • Argument zwei ist bei nonstatic native Methoden • Zeiger auf Java-Objekt („this“) in JVM

  12. Ein Blick hinter die Kulissen 4Was macht der Garbage Collector auf der nativen Seite? • Primitive werden kopiert • Java-Objekte „by reference“ übergeben • Unterteilung in lokale / globale Referenzen • Lokale Referenzen leben im Scope ihres erzeugendem Stack-Frame und Thread gelöscht ab „return“ (Vorsicht, JVM hat begrenzten Speicher um sich lokale Referenzen zu merken!) • Globale Referenzen leben bis sie explizit freigegeben werden • Lokale Referenzen können in globale umgewandelt werden • JNI Funktionen geben lokale Referenzen zurück

  13. Ein Blick hinter die Kulissen 5 Wohin mit Fehlern? • JNI Funktionen geben Fehlercodes • Können mit ExceptionOccoured() abgefragt werden • Zwei Arten des Exceptionhandlings • Die native Methode kehrt zurück  Exception wird im Javacode geworfen • Die native Methode ruft ExceptionClear() auf und kümmert sich selbst um das Exceptionhandling

  14. Der Weg zur Verwendung 1 • Voraussetzungen um native Methoden zu nutzen • Deklaration – auf Java Seite • Implementierung – als externe Einstiegspunkte in binären Bibliotheken • JNI stellt die Möglichkeit eines „call back“ auf die aufrufende JVM bereit • Laden – der Bibliothek (typischerweise im „static initializer“ der Java Klasse die „native“ verwendet) • System.load(…) oder System.loadLibrary(…)

  15. Der Weg zur Verwendung 2 Deklaration – auf Java Seite • Vorbereitung zum Erstellen der Headerdatei für native Seite • set JAVA_HOME=C:\Programme\Java\jdk1.6.0_XX • set PATH=%PATH%;%JAVA_HOME%\bin • C:\PROJECT_PATH\bin>javap -private -s de.package.jni.Klasse

  16. Der Weg zur Verwendung 3 Implementierung – auf native Seite • Inkludieren der Headerdatei „<jni.h>“ • Gemäß der Namenskonvention muss eine Funktionsdeklaration geschrieben werden • Geht’s auch einfacher?? JNIEXPORTjbooleanJNICALL Java_de_paket_jni_Klasse_callNative (JNIEnv *, jobject , jint);

  17. Der Weg zur Verwendung 4 Implementierung – auf native Seite • Kommandozeilentool zum Erzeugen der Headerdatei • set JAVA_HOME=C:\Programme\Java\jdk1.6.0_XX • set PATH=%PATH%;%JAVA_HOME%\bin • C:\PROJECT_PATH\bin>javah de.package.jni.Klasse

  18. Der Weg zur Verwendung 5 Laden – der Bibliothek

  19. DEMO

  20. Quellen • IBM Understanding the Java Native Interface • http://publib.boulder.ibm.com/infocenter/javasdk/v6r0/topic/com.ibm.java.doc.diagnostics.60/html/jni.html#jni • Native Methoden und Bibliotheken (1997) • http://olymp.idle.at/~apollo/books/Java%20in%2021%20Tagen/kap20.htm • JNI 1.1 Specification ff. • http://java.sun.com/j2se/1.4.2/docs/guide/jni/ • Gute Übersicht für den Praktischen Einsatz • http://www.haertfelder.com/jni.html

More Related