Pregunta

He sido desarrollador de Java durante un par de años y he oído que puedes 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.

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

¿Fue útil?

Solución

Es muy útil. Puedo ver 2 razones principales para usar JNI (probablemente hay más).

  1. Rendimiento. Si tiene un código en el que Java Runtime, por cualquier motivo, no puede reducir su rendimiento. Puede implementar esa función en código nativo y llamarla desde Java. Esto le permite ajustar manualmente la implementación si realmente lo necesita. Sin embargo, esta es probablemente la razón menos común, Java generalmente funciona bien.

  2. Acceso a API específicas del sistema operativo. Este es un problema. He tenido un caso en el que necesitaba hacer algo en Java, pero también necesitaba acceso a algo que Java simplemente no podía proporcionar. En mi caso fueron los sockets de dominio UNIX. Dado que (como puede ver por el nombre) son específicos de UNIX, no hay 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.

Otros consejos

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

Es relativamente difícil (al lado de Java puro), pero potente y no horrible.

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

Puedo pensar en algunos usos fuera de mi cabeza:

  1. integración con bajo nivel existente (C / C ++) API que no tienen Java contraparte
  2. integrando con aspectos del sistema que no están expuestos a través de las API de Java disponibles (directo acceso al 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á volviendo bastante rápido y las complicaciones del uso de JNI probablemente superarían cualquier beneficio de rendimiento que pueda ver.

Hay algunos usos para enlazar a FFMPeg para decodificar en C (o casi cualquier) formato de video / audio.

También hay JNA, lo que hace que parezca que está utilizando la biblioteca en sí. Esto es " más fácil " desde el punto de vista que le pasa todo al desarrollador de Java para que lo administre, y más difícil en el sentido de que tiene que averiguar el mapeo de la estructura y hacer mucho trabajo duro para que todos los punteros, etc., pasen correctamente.

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top