Nützlichkeit von JNI [geschlossen]

8

Ich war ein paar Jahre lang 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.

Ich frage mich, wie nützlich dieser Aspekt von Java ist. Beispiele wären großartig.

    
javamonkey79 31.12.2008, 06:26
quelle

5 Antworten

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. Auf diese Weise können Sie die Implementierung manuell anpassen, wenn Sie wirklich benötigen. Dies ist wahrscheinlich der am wenigsten häufige 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.

Evan Teran 31.12.2008, 06:51
quelle
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 du es brauchst, brauchst du 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 daran, JNA zu verwenden.

    
Lawrence Dol 31.12.2008 08:45
quelle
2

Ich kann mir ein paar Anwendungen von ganz oben vorstellen:

  1. Integration mit bestehenden Low-Level (C / C ++) APIs, die kein Java haben Gegenstück
  2. Integration mit Aspekten des Systems, die nicht ausgesetzt sind durch verfügbare Java APIs (direkt Hardwarezugriff usw.)

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 die Vorteile der Performance überwiegen.

    
Marc Novakowski 31.12.2008 06:52
quelle
1

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

Es gibt auch JNA, was es so macht, als ob Sie die Bibliothek selbst benutzen. 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 richtig.

    
Rob Elsner 31.12.2008 08:46
quelle
1

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

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

    
dlinsin 31.12.2008 08:52
quelle

Tags und Links