Consejo 23 de Java: escribir métodos nativos

La capacidad de escribir solo un conjunto de código en Java y hacer que se ejecute en cada sistema con un tiempo de ejecución de Java es una de las principales fortalezas de Java. Pero esta independencia de la plataforma tiene un inconveniente clave: ¿Qué hacemos con la gran cantidad de código existente? El truco consiste en utilizar la llamada interfaz de método nativo .

Escribir métodos nativos implica importar código C a su aplicación Java. En este consejo, lo guiaré a través de la receta básica para crear métodos nativos y usarlos en una aplicación Java.

Siete pasos para el nirvana de métodos nativos Los pasos para crear métodos nativos son los siguientes:

  • Escribir código Java
  • Compilar código Java
  • Crear encabezado C ( archivo .h )
  • Crear archivo de código auxiliar C
  • Escribir código C
  • Crear biblioteca de código compartido (o DLL)
  • Ejecutar aplicación

Nuestro ejercicio es escribir texto en la consola desde dentro del método nativo. Los detalles de este ejemplo estarán orientados a un sistema similar a Unix, específicamente Linux. Señalaré un par de puntos donde los detalles difieren para otras plataformas.

Escribir código Java

Escriba su código Java como lo haría normalmente. Para utilizar métodos nativos en su código Java, debe hacer dos cosas. Primero, escriba una declaración de método nativo para cada método nativo que desee utilizar. Esto es como escribir la declaración de una interfaz de método Java normal, pero debe especificar la palabra clave nativa , de la siguiente manera:

public native void printText (); 

El segundo aro para saltar es que debe cargar explícitamente la biblioteca de código nativo. (Crearemos esto más adelante). Hacemos esto cargando la biblioteca en un bloque estático de clase:

static {System.loadLibrary ("feliz"); }

Para juntar estas piezas para nuestro ejemplo, cree un archivo llamado Happy.javacon el siguiente contenido:

class Happy {public native void printText (); static {System.loadLibrary ("feliz"); / * ¡Note la minúscula del nombre de la clase! * /} public static void main (String [] args) {Happy happy = new Happy (); happy.printText (); }}

Compilar código Java

Compila el Happy.javaarchivo:

% javac Happy.java 

Crear un archivo de encabezado C

Hay varios encantamientos mágicos que deben estar disponibles para que nuestro código C se pueda utilizar como método nativo. La javahfuncionalidad del compilador de Java generará las declaraciones necesarias y demás de nuestra Happyclase. Esto creará un Happy.harchivo para que lo incluyamos en nuestro código C:

% javah feliz 

Crear un archivo de código auxiliar C

De una manera que recuerda a la manipulación que hacen los traductores de C ++ con los nombres de los métodos de C ++, el compilador de Java tiene una locura similar. Para aliviar el dolor de tener que escribir mucho código tedioso para que nuestro código C pueda ser invocado desde el sistema de ejecución de Java, el compilador de Java puede generar el código trampolín necesario automáticamente para nosotros:

% javah -stubs Happy 

Escribir código C

Ahora, escribamos el código real para imprimir nuestro saludo. Por convención, colocamos este código en un archivo con el nombre de nuestra clase Java con la cadena "Imp" adjunta. Esto da como resultado HappyImp.c. Coloque lo siguiente en HappyImp.c:

#include & ltStubPreamble.h> / * Material de método nativo estándar. * / #include "Happy.h" / * Generado anteriormente. * / #include & ltstdio.h> / * Material de E / S C estándar. * / void Happy_printText (struct HHappy * this) {put ("¡¡¡Feliz año nuevo !!!"); }

Al conectar su código C con Java, están involucrados muchos otros aspectos, como cómo pasar y devolver la miríada de tipos. Para obtener más información, consulte el tutorial de Java o el documento de métodos nativos de Hermetica (consulte la sección de Recursos para conocer las URL).

Crea una biblioteca compartida

This section is the most system-dependent. It seems like every platform and each compiler/linker combination has a different method of creating and using shared libraries. For folks using any of the various Microsoft Windows platforms, check the documentation for your C compiler for the nitty-gritty details.

For you Linux folks, here's how to create a shared library using GCC. First, compile the C source files that we have already created. You have to tell the compiler where to find the Java native method support files, but the main trick here is that you have to explicitly tell the compiler to produce Position Independent Code:

% gcc -I/usr/local/java/include -I/usr/local/java/include/genunix -fPIC -c Happy.c HappyImp.c 

Ahora, cree una biblioteca compartida a partir de los archivos de objeto (.o) resultantes con el siguiente encantamiento mágico:

% gcc -shared -Wl, -soname, libhappy.so.1 -o libhappy.so.1.0 Happy.o HappyImp.o 

Copie el archivo de la biblioteca compartida al nombre corto estándar:

% cp libhappy.so.1.0 libhappy.so 

Por último, es posible que deba indicarle a su vinculador dinámico dónde encontrar este nuevo archivo de biblioteca compartida. Usando el shell bash :

% export LD_LIBRARY_PATH = `pwd`: $ LD_LIBRARY_PATH 

Ejecuta la aplicación

Ejecute la aplicación Java como de costumbre:

% java Happy 

Bueno, eso es todo. Gracias a Tony Dering por transmitir los encantamientos específicos de Linux.

Una nota de diseño rápida

Antes de apresurarnos a escribir métodos nativos para todo ese código heredado, me gustaría advertirnos a todos que miremos detenidamente los sistemas existentes y veamos si hay mejores formas de conectarlos a Java. Por ejemplo, existen Java Database Connectivity (JDBC) e incluso soluciones de nivel superior para acceder a bases de datos desde Java. Por lo tanto, mire todos los trucos en su bolso y use lo que tenga sentido para el proyecto en cuestión.

Más información sobre este tema

  • Tutorial del método nativo de JavaSoft //www.javasoft.com/books/Series/Tutorial/native/implementing/index.html
  • Documento sobre métodos nativos de Hermetica //www.hermetica.com/technologia/java/native/

Esta historia, "Consejo 23 de Java: escribir métodos nativos", fue publicada originalmente por JavaWorld.