JNI - norman-ipn/Android GitHub Wiki

// siento que es mas facil crear el archivo en cualquier otro lenguaje y jalar ese codigo en java
con JNI

//A grandes rasgos

JNI (Java Native Interface) es la forma que tenemos de llamar desde java a funciones que están hechas en otro lenguaje, por ejemplo, funciones hechas en C.
Necesitamos en primer lugar una librería con las funciones de C ya compiladas. En windows dicha librería suele tener extensión .dll
El siguiente paso es crear una clase java que tenga métodos native. Estos métodos se dejan sin rellenar y debemos llamarlos cuando queramos que se llama a la .dll.
Compilamos dicha clase
Ahora con javah, una utilidad que viene con java, se la pasamos al .class generado. Esto generará un .h con el método native pero en un formato especial.
Escribimos el .c para esa función generada de forma que llame a las funciones que queramos de la .dll
Con nuestro .c y el .h generado por java, compilamos para construir una librería compartida .so (unix) o de enalce dinámico .dll (windows).
Ahora basta meter esa librería en un sitio que se encuentre en el path de busqueda (PATH en windows, LD_LIBRARY_PATH en unix) y ejecutar nuestro programa java.

  1. ### ¿Cuándo usar JNI?**
    En algunas ocasiones, a algunos desarrolladores les tocará encontrarse en situaciones en
    las que una aplicación hecha completamente en Java no cubrirá todos los requerimientos
    para tal. Algunos ejemplos de estas situaciones pueden ser:

1 Cuando a pesar de querer escribir toda la aplicación en Java para permitir la
compatibilidad entre plataformas, exiten características de la plataforma que son
necesarias para la aplicación y no son soportadas por la librería estándar de Java.
Esto es referido como dependencia de la plataforma.• Cuando ya se tiene una librería escrita en algún otro lenguaje y se desea hacerla
accesible a nuestro código Java, por ejemplo, al tener que trabajar con código
legacy. en estos casos las librerías se cargan dentro del mismo proceso de la
apliación por medio de JNI, aunque existen otros mecanismos más eficientes que
funcionan en procesos separados.

2 Si se quiere implementar porciones de código en un lenguaje de bajo nivel como
ensamblador para disminuir el tiempo de procesamiento. Por ejemplo, en
aplicaciones que necesiten renderizar gráficos 3D que requieren más tiempo de
procesamiento, habrá que escribir una librería para gráficos en lenguaje
ensamblador para tener un mejor rendimiento

3En casos en los que quiera cargar una librería nativa en un proceso existente para
evitar el costo de iniciar un nuevo proceso y cargar la librería en el mismo

4 También será oportuno usar JNI cuando se quiera utilizar algunas funcionalidades
de un programa Java desde un código nativo

// basicamente se requieren pocos pasos

1- Definir una clase Java con los métodos nativos
2- Compilar el .java anterior y luego correr el comando javah para generar el .h con los headers C que se corresponden con los métodos nativos definidos en la clase.

3 – Programar en C la implementación del método nativo holaMundo utilizando el header que obtuvimos luego de correr el comando javah.

4 – Compilar el código C y generar una DLL.
Si usamos MinWG el comando será el siguiente:

gcc -c -I%JAVA_HOME\include -I%JAVA_HOME%\include\win32 demoJNI.c
gcc -shared -o demoJNI.dll demoJNI.o

5 – Escribir un programa que instancie la clase CLib e invoque al método holaMundo.

6-compilar: Cada compilador de C o C++ tiene su propia herramienta para crear bibliotecas compartidas (DLL en Windows o SO en UNIX).
Para crear la biblioteca se ha de compilar el fichero fuente nativo, y luego crear la biblioteca compartida mediante el programa correspondiente a su compilador.
Para esto cada compilador tiene su propia sintaxis, con lo que se tendrá que consultar la documentación del compilador en lo referente a la creación de bibliotecas.
cc -G HolaNativo.c -o libHola.so.

⚠️ **GitHub.com Fallback** ⚠️