Frage

Ich habe ein Java-Entwickler für ein paar Jahre gewesen und habe gehört, dass Sie ein paar ziemlich nützliche und leistungsfähige Dinge mit JNI tun können. Ich weiß nicht, ob ich gerade nicht, es zu benutzen benötigt oder wenn es nicht sehr relevant ist für mich; aber ich habe es nicht hatte überhaupt zu berühren.

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

War es hilfreich?

Lösung

Es ist sehr nützlich. Ich kann zwei primäre Gründe siehe JNI zu verwenden (es gibt wahrscheinlich mehr).

  1. Performance. Wenn Sie ein Stück Code haben, in dem der Java-Runtime aus irgendeinem Grund nicht Leistung klug schneiden kann. Sie können diese Funktion in nativen Code implementieren und aus Java aufrufen. So können Sie Hand Abstimmung der Umsetzung, wenn Sie wirklich müssen. Dies ist wahrscheinlich der kleinste gemeinsame Grund aber, Java führt in der Regel nur in Ordnung.

  2. Der Zugriff auf OS spezifische APIs. Dies ist ein großes Problem. Ich habe einen Fall, wo ich brauchte etwas in Java zu tun, sondern auch den Zugang benötigt, um etwas, das Java konnte einfach nicht bieten. In meinem Fall war es UNIX-Domain-Sockets. Da (wie kann man mit dem Namen sagen) sie UNIX spezifisch ist, gibt es keine Standard-Java-Art und Weise, sie zu nutzen. Also machte ich eine Klasse, die wie ein Wrapper um sie in C gehandelt und zugegriffen es mit JNI. Viola, Problem gelöst.

Andere Tipps

Ich habe eine umfangreiche JNI-Schicht für die iSeries geschrieben für den Zugriff auf DB2, Benutzer-Warteschlangen, Datenwarteschlangen und ein paar andere OS / 400 Besonderheiten. Ein großer Teil unseres Systems auf der iSeries wäre ohne JNI nicht möglich gewesen. Also, ja, JNI hat seinen Platz, und wenn Sie es brauchen, Sie wirklich brauchen.

Es ist relativ schwierig, (neben reiner Java), aber leistungsfähig und nicht schrecklich.

Auch wenn ich irgend JNI Code suchen, halte ich auch mit JNA .

Ich kann die Spitze von meinem Kopf denken Sie an ein paar Anwendungen aus:

  1. Integration mit bestehenden Low-Level (C / C ++) APIs, die kein Java haben Gegenstück
  2. Integration mit Aspekten des Systems, die nicht freigelegt werden durch die verfügbare Java-APIs (direkte Zugriff auf die Hardware, etc.)

Man könnte sagen, es hoch optimierten Code-Abschnitte nützlich sein kann, jedoch mit modernen JVMs für das Erstellen Sie bekommen ziemlich schnell und die Komplikationen der Verwendung von JNI wahrscheinlich jede Leistung Nutzen aufwiegen würden Sie sehen könnten.

Es gibt ein paar Anwendungen für für C-Decodierung von (verdammt nahe vorhanden) Video / Audio-Format zu ffmpeg Bindung.

Es gibt auch JNA, die es macht, wie Sie die Bibliothek selbst verwenden. Das ist „einfacher“ vom Standpunkt, dass es alles rund um den Java-Entwickler geht zu verwalten, und härter in dem Sinne, dass Sie haben die Struktur-Mapping, um herauszufinden, und arbeitet viel Grunzen alle Zeiger zu bekommen, etc, passieren richtig.

Wir hatten eine Anforderung, eine neue Benutzeroberfläche um eine Legacy-C-Anwendung zu wickeln läuft auf Suse Linux. JNI war das perfekte Werkzeug für den Job.

Generell denke ich, JNI ist ein Widerspruch zu dem Java Begriff der Write Once, überall starten. Allerdings gibt es Fälle, in denen die Verwendung von JNI nützlich sein kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top