java - ejemplos - jni nazareno
Utilidad de JNI (5)
He sido desarrollador de Java por un par de años y he escuchado 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 es la utilidad de este aspecto de Java. Los ejemplos serían geniales.
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 en sí. 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.
He escrito una extensa capa JNI para que 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 necesitas, realmente lo necesitas.
Es relativamente difícil (al lado de Java puro), pero poderoso 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:
- integración con API existentes de bajo nivel (C / C ++) que no tienen una contraparte Java
- integrarse con aspectos del sistema que no están expuestos a través de las API Java disponibles (acceso directo 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á logrando bastante rápido y las complicaciones de usar JNI probablemente superen cualquier beneficio de rendimiento que pueda ver.
Tuvimos el requerimiento de envolver una nueva interfaz de usuario alrededor de 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.
Es muy útil. Puedo ver 2 razones principales para usar JNI (es probable que haya más).
Actuación. 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 sintonizar a mano la implementación si realmente lo necesita. Sin embargo, esta es la razón menos común, Java generalmente funciona bien.
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.