##
CREAR EL FICHERO DE CABECERA

Ahora debemos utilizar la aplicación javah para conseguir el fichero de cabecera .h. El fichero de cabecera define una estructura que representa la clase HolaMundo sobre código C y proporciona la definición de una función C para la implementación del método nativo presentaSaludo() definido en ese clase.

Ejecutamos javah sobre la clase HolaMundo, con el siguiente comando:

    > javah HolaMundo

Por defecto, javah creará el nuevo fichero .h en el mismo directorio en que se encuentra el fichero .class, obtenido al compilar con javac el código fuente Java correspondiente a la clase. El fichero que creará, será un fichero de cabecera del mismo nombre que la clase y con extensión .h. Por ejemplo, el comando anterior habrá creado el fichero HolaMundo.h, cuyo contenido será el siguiente:

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <native.h>
    /* Header for class HolaMundo */

    #ifndef _Included_HolaMundo
    #define _Included_HolaMundo

    typedef struct ClassHolaMundo {
        char PAD; /* ANSI C requires structures to have a least one member */
    } ClassHolaMundo;
    HandleTo(HolaMundo);

    #ifdef __cplusplus
    extern "C" {
    #endif
    __declspec(dllexport) void HolaMundo_presentaSaludo(struct HHolaMundo *);
    #ifdef __cplusplus
    }
    #endif
    #endif

Este fichero de cabecera contiene la definición de una estructura llamada ClassHolaMundo. Los miembros de esta estructura son paralelos a los miembros de la clase Java correspondiente; es decir, los campos en la estructura corresponden a las variables de la clase. Pero como HolaMundo no tiene ninguna variable, la estructura se encuentra vacía. Se pueden utilizar los miembros de la estructura para referenciar a variables instanciadas de la clase desde las funciones C.

Además de la estructura C similar a la clase Java, vemos que la llamada de la función C está declarada como:

    extern void HolaMundo_presentaSaludo( struct HHolaMundo *);

Esta es la definición de la función C que deberemos escribir para implementar el método nativo presentaSaludo() de la clase HolaMundo. Debemos utilizar esa definición cuando lo implementemos. Si HolaMundo llamase a otros métodos nativos, las definiciones de las funciones también aparecerían aquí.

El nombre de la función C que implementa el método nativo está derivado del nombre del paquete, el nombre de la clase y el nombre del método nativo. Así, el método nativo presentaSaludo() dentro de la clase HolaMundo es HolaMundo_presentaSaludo(). En este ejemplo, no hay nombre de paquete porque HolaMundo se considera englobado dentro del paquete por defecto.

La función C acepta un parámetro, aunque el método nativo definido en la clase Java no acepte ninguno. Se puede pensar en este parámetro como si fuese la variable this de C++. En nuestro caso, ignoramos el parámetro this.

|  | ##### [Anterior] [Indice] [Siguiente]