2008-12-31 9 views
8

He sido desarrollador de Java por un par de años y he escuchado que puede hacer algunas cosas bastante útiles y poderosas con JNI. No sé si simplemente no he necesitado usarlo o si no es terriblemente relevante para mí; pero no he tenido que tocarlo en absoluto.Utilidad de JNI

Me pregunto cuál es la utilidad de este aspecto de Java. Los ejemplos serían geniales.

+0

Hay días en que Java (la versión de servidor) no es notablemente más lenta que C++ en la mayoría de los casos de uso real, y la invocación de API de sistema especial también es un caso bastante específico. El uso más real es cuando necesita usar alguna biblioteca (matemática o lo que sea específico), que está escrita en C/C++ hace mucho tiempo y aún es compatible, pero no hay una versión de esta lib escrita en Java. – Zorkus

Respuesta

12

Es muy útil. Puedo ver 2 razones principales para usar JNI (es probable que haya más).

  1. Rendimiento. Si tiene un fragmento de código en el que el Java Runtime por alguna razón no puede reducirlo en cuanto al rendimiento. Puede implementar esa función en código nativo y llamarlo desde Java. Esto le permite ajustar manualmente la implementación si realmente necesita . Sin embargo, esta es la razón menos común, Java generalmente funciona bien.

  2. Acceso a las API específicas del sistema operativo. Este es un problema. Tuve un caso en el que necesitaba hacer algo en Java pero también necesitaba acceder a algo que Java simplemente no podía proporcionar. En mi caso se trataba de sockets de dominio UNIX. Como (como puede ver por su nombre) son específicos de UNIX, no existe una forma estándar de Java para usarlos. Así que hice una clase que actuó como un envoltorio alrededor de ellos en C y accedí a ella con JNI. viola, problema resuelto.

+0

Heh ... su segunda respuesta me recuerda mi clase de ensamblador en la universidad: tuvimos que combinar las funciones de ensamblador y C para terminar una tarea. Cosas aseadas realmente. – javamonkey79

+0

Puede generalizar su segundo punto a todas las bibliotecas externas de C/C++ de las que depende el software de Java. – Guillaume

2

puedo pensar en algunos usos de la parte superior de mi cabeza:

  1. integración con las API de bajo nivel (C/C++) existentes que no tienen una contraparte de Java
  2. integración con aspectos del sistema que no están expuestos través de las API de Java disponible (acceso directo hardware, etc.)

Algunos podrían decir que puede ser útil para crear secciones de código altamente optimizadas; sin embargo, con las JVM modernas se está logrando bastante rápido y las complicaciones de usar JNI probablemente superen cualquier beneficio de rendimiento que pueda ver.

+0

Estoy de acuerdo, pero en realidad, sus razones 1 y 2 son realmente lo mismo, ya que cualquier cosa como el acceso directo al hardware va a estar disponible con una API C/C++. No se pueden escribir exactamente los controladores en Java, por lo que tendrías que acceder de la misma manera que C :-P. –

+0

Para el n. ° 1 estaba pensando más en API de terceros (o heredadas) que no tienen una implementación Java o incluso código fuente (solo una biblioteca para vincular). Para el # 2 estaba pensando más en la línea de su # 2, es decir, soporte de enlace simbólico –

4

He escrito una extensa capa JNI para que el iSeries acceda a DB2, colas de usuario, colas de datos y algunos otros detalles específicos de OS/400. Gran parte de nuestro sistema en el iSeries habría sido imposible sin JNI. Entonces, sí, JNI tiene su lugar, y cuando lo necesite, usted realmente lo necesita.

Es relativamente difícil (junto a Java puro), pero potente y no horrible.

Además, cada vez que miro algún código JNI, también considero usar JNA.

+0

No creo haber visto a JNA antes, ¡vaya! ¡Soy tan novato! Je, gracias: D – javamonkey79

+0

De nada; Nunca lo he usado porque mi necesidad de soporte nativo era (a) iSeries, y (b) completa y estable hace años ... pero estoy intrigado y lo intentaré si alguna vez necesito acceso nativo para Windows o Linux. –

1

Hay algunos usos para enlazar a FFMPeg para la decodificación en C de (maldito cerca de cualquier) formato de video/audio.

También hay JNA, lo que hace que sea como si estuviera utilizando la biblioteca. Esto es "más fácil" desde el punto de vista de que le pasa todo al desarrollador de Java para que lo administre, y más difícil en el sentido de que tiene que descubrir el mapeo estructural y hacer un gran trabajo para que todos los apuntadores, etc. correctamente.

+0

He usado JNI para enlazar una aplicación swing para decodificar mpegs de una manera portátil (piense en linux, x64, windows, os x). Fue un desastre, pero funcionó bien al final. –

+0

También hay enlaces JNI para ffmpeg. Utilicé JNA porque necesitaba acceder a las estructuras para que esas vinculaciones no pasaran a través de la capa JNI. –

1

Teníamos el requisito de ajustar una nueva interfaz de usuario en torno a una aplicación heredada de C que se ejecuta en Suse Linux.JNI era la herramienta perfecta para el trabajo.

En general, creo que JNI es una contradicción con la noción de Java de Write Once, Run Anywhere. Sin embargo, hay casos de uso donde JNI puede ser útil.