2008-12-31 8 views
8

Ich bin seit ein paar Jahren ein Java-Entwickler und habe gehört, dass Sie mit JNI einige ziemlich nützliche und mächtige Dinge tun können. Ich weiß nicht, ob ich es nicht gebraucht habe oder ob es für mich nicht besonders relevant ist. aber ich musste es überhaupt nicht anfassen.Nützlichkeit von JNI

Ich frage mich, was die Nützlichkeit dieses Aspekts von Java ist. Beispiele wären großartig.

+0

Da Java (-Server-Version) in den meisten echten Anwendungsfällen tatsächlich nicht merklich langsamer als C++ ist, ist auch der Aufruf spezieller System-API ein ziemlich spezieller Fall. Die praktischste Verwendung ist, wenn Sie eine Bibliothek (mathematisch oder was auch immer) verwenden müssen, die vor langer Zeit in C/C++ geschrieben wurde und noch immer unterstützt wird, aber es gibt keine Version dieser Bibliothek in Java geschrieben. – Zorkus

Antwort

12

Es ist sehr nützlich. Ich kann 2 Hauptgründe sehen, JNI zu benutzen (es gibt wahrscheinlich mehr).

  1. Leistung. Wenn Sie einen Code haben, in dem die Java-Runtime aus irgendeinem Grund nicht leistungsmäßig abgeschnitten werden kann. Sie können diese Funktion in systemeigenem Code implementieren und aus Java aufrufen. Dies ermöglicht Ihnen, die Implementierung manuell zu tunen, wenn Sie wirklich benötigen. Dies ist wahrscheinlich der seltenste Grund, obwohl Java normalerweise gut funktioniert.

  2. Zugriff auf betriebssystemspezifische APIs. Dieser ist ein großes Problem. Ich hatte einen Fall, in dem ich etwas in Java machen musste, aber auch Zugriff auf etwas, das Java einfach nicht bieten konnte. In meinem Fall waren es UNIX Domain Sockets. Da (wie Sie anhand des Namens feststellen können) sie UNIX-spezifisch sind, gibt es keinen Standard-Java-Weg, sie zu verwenden. Also machte ich eine Klasse, die in C wie ein Wrapper um sie herum agierte und mit JNI darauf zugreift. Viola, Problem gelöst.

+0

Heh ... deine zweite Antwort erinnert mich an meine Assembler-Klasse in der Schule - wir mussten Assembler- und C-Funktionen kombinieren, um eine Aufgabe zu beenden. Ordentliches Zeug wirklich. – javamonkey79

+0

Sie können Ihren zweiten Punkt auf alle externen C/C++ - Bibliotheken verallgemeinern, von denen Ihre Java-Software abhängig ist. – Guillaume

2

ich von einigen Anwendungen aus der Spitze von meinem Kopf denken kann:

  1. Integration mit bestehenden Low-Level- (C/C++) APIs, die
  2. keine Java Pendant haben
  3. Integration mit Aspekten des Systems, das nicht durch die verfügbaren Java-APIs (direkte Zugriff auf die Hardware, etc.)
ausgesetzt sind

Manche mögen sagen, dass es nützlich sein kann, um hochoptimierte Codeabschnitte zu erstellen, aber mit modernen JVMs werden Sie ziemlich schnell und die Komplikationen bei der Verwendung von JNI würden wahrscheinlich alle Leistungsvorteile überwiegen, die Sie vielleicht sehen.

+0

Dem stimme ich zu, aber in Wirklichkeit sind Ihre Gründe 1 und 2 wirklich das Gleiche, da mit einem C/C++ - API so etwas wie direkter Hardwarezugriff verfügbar sein wird. Sie können Treiber in Java nicht genau schreiben, also müssen Sie auf dieselbe Weise auf C zugreifen: - P. –

+0

Für # 1 habe ich mehr über Drittanbieter-APIs (oder ältere APIs) nachgedacht, die keine Java-Implementierung oder gar Quellcode enthalten (nur eine Bibliothek, zu der eine Verknüpfung hergestellt werden kann). Für # 2 dachte ich eher an die Zeilen Ihrer # 2, d. H. Symbolische Link-Unterstützung –

4

Ich habe eine umfangreiche JNI-Schicht für die iSeries geschrieben, um auf DB2, Benutzerwarteschlangen, Datenwarteschlangen und einige andere OS/400-Besonderheiten zuzugreifen. Ein Großteil unseres Systems auf der iSeries wäre ohne JNI unmöglich gewesen. Also, ja, JNI hat seinen Platz, und wenn Sie es brauchen, brauchen Sie es wirklich.

Es ist relativ schwierig (neben reinem Java), aber mächtig und nicht schrecklich.

Wenn ich mir einen JNI-Code ansehe, denke ich auch an JNA.

+0

Ich glaube nicht, dass ich JNA schon einmal gesehen habe, wow, ich bin so ein Noob! Heh, danke: D – javamonkey79

+0

Gern geschehen; Ich habe es nie benutzt, weil mein Bedürfnis nach nativer Unterstützung (a) iSeries und (b) vor Jahren abgeschlossen und stabil war ... aber ich bin fasziniert davon und werde es versuchen, wenn ich nativen Zugriff für Windows oder Windows XP benötige Linux. –

1

Es gibt ein paar Verwendungen für die Bindung an FFMPeg für C-Decodierung von (verdammt fast alle) Video/Audio-Format.

Es gibt auch JNA, was es so macht, als ob Sie die Bibliothek selbst benutzen würden. Dies ist "einfacher" von dem Standpunkt aus, dass es alles an den Java-Entwickler weitergibt, und schwieriger in dem Sinne, dass Sie das Struktur-Mapping herausfinden und eine Menge Grunz-Arbeit machen müssen, um alle Zeiger usw. zu bestehen korrekt.

+0

Ich habe JNI verwendet, um eine Swing-App zu binden, um mpegs auf eine tragbare Weise zu dekodieren (denke Linux, x64, Windows, OS X). Es war ein Durcheinander, aber es hat am Ende gut geklappt. –

+0

Es gibt JNI-Bindungen für ffmpeg. Ich benutzte JNA, da ich Zugriff auf Strukturen benötigte, die diese Bindungen nicht durch die JNI-Schicht passierten. –

1

Wir hatten die Anforderung, eine neue Benutzeroberfläche um eine Legacy-C-Anwendung zu erstellen, die auf Suse Linux ausgeführt wird.JNI war das perfekte Werkzeug für den Job.

Im Allgemeinen denke ich, JNI ist ein Widerspruch zu der Java-Idee von Write Once, Run Anywhere. Es gibt jedoch Anwendungsfälle, in denen JNI nützlich sein kann.