índice

INTERFAZ CON C

INTRODUCCIÓN

CREACIÓN DEL CÓDIGO

UTILIZACIÓN DEL CÓDIGO







INTRODUCCIÓN

Existen numerosas librerías escritas en C útiles para:

C es inevitable y no tener una interfaz con C limitaría Java a aplicaciones sin una gran trascendencia.
Esta interfaz es más difícil de realizar en Java que en C++, lo cual es una gran calidad de Java. La frontera entre ambos no es natural, y conviene hacerla tan estrecha como sea posible. Esto hará el código portable y modular.

volver


CREACIÓN DEL CÓDIGO


EL CÓDIGO JAVA

Contrariamente a C++, que acepta las interfaces que los programas en C tengan a bien darle, Java genera él mismo las interfaces que quiere tener en cuenta.

En C++, se escribe el código a partir de las interfaces de C existentes. En Java, se escribe el programa en Java, el sistema genera una interfaz en C, y se tiene que espabilar para implementarla.

Un ejemplo donde una clase sirve para interrogar a una base de datos.

	import java.lang.*;
	class SQLQuery {
		String contenidoRespuesta;
		int numCuestion;
		public SQLQuery ( ) {
			contenidoRespuesta = " ";
		}
		public native void ponCuestion (String laCuestion);
		static {
			System. loadLibrary ("SQL");
		};
	};

Obsérvese dos novedades:

Este constructor de clase:

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

se ejecuta la primera vez que se crea un objeto definido por esta clase.
Este código es compilable como otro código.

Es necesario ahora generar la interfaz con C. Esta interfaz se ubicará en un fichero.h con el nombre de la clase. Aquí: SQLQuery.h. Esto se hace llamando a javah SQLQuery, después de haber utilizado javac.

volver


LA INTERFAZ CON C

En el ejemplo, este fichero SQLQuery.h es un fichero generado por javah; tiene el aspecto siguiente:

	/ * DO NOT EDIT THIS FILE - it is machine generated * /
	#include <native.h>
	/ * Header for class SQLQuery * /
	
	#ifndef _Included_SQLQuery
	#define _Included_SQLQuery
	struct Hjava_lang_String;
	typedef struct ClassSQLQuery {
		struct Hjava_lang_String *contenuReponse;
			long numQuestion;
	} ClassSqlquery;
	HandleTo (SQLQuery);	

	# ifdef _cplusplus
	extern "C" {
	#endif
	_declspec (dllexport) void SQLQuery_poseQuestion	
	(struct HSQLQuery *, struct Hjava_lang_String *);
	#ifdef _cplusplus
	}	
	#endif	
	#endif

Esto es C, no cabe duda.
Se encuentra sucesivamente:

Se tiene por una parte una estructura ClassSQLQuery, y por otra parte una función que espera una estructura HSQLQuery.

Es la macro HanleTo quien hace el enlace entre los dos. Esta macro está definida en el fichero native.h incluido al principio de SQLQuery.h. Su definición es la siguiente:

	#define HandleTo (T) typedef struct H##T {Class##T *obj; 
	struck methodtable *methods;} H##T

lo que hace que la línea

	HandleTo (SQLQuery);

sea equivalente a:

	
	typerdef struct HSQLQuery {
		ClassSQLQuery *obj;
		struck methodtable *methods;} HSQLQuery;

Se pasa en realidad a la función un par {clase, tablas de métodos}.

volver


EL CUERPO EN C

También es necesario generar un fichero SQLQuery.c. Este fichero permitirá realizar el enlace entre el código C que desarrollará y el código Java. Esto se hace con la opción stubs de javah, que genera un fichero SQLQuery.c.


Véase a qué se parece el SQLQuery.c (en una máquina Windows 95):

	/ * DO NOT EDIT THIS FILE - it is machine generated * /
	#include <StubPreamble.h>

	/ * Stubs for class SQLQuery * /
	/ * SYMBOL: "SQLQuery / ponCuestion (Ljava/lang/String;)
	V",
	#Java_SQLQuery_ponCuestion_stub * /
	_declspec (dllexport) stack_item
	** Java_SQLQuery_ponCuestion_stub
	(stack_item *_P_, struck execenv *_EE-) {
		extern void SQLQuery_ponCuestion(void *,void * );
		(void) SQLQuery_ponCuestion(_P_[0.p,((_P_[1.p)));
		return _P_;
	}

De todos modos, sólo se tiene que compilar este fichero, y olvidar enseguida el contenido.

Por el contrario, se deberá también desarrollar el cuerpo de la función de la que SQLQuery.h. da la interfaz. Es necesario pues, en un fichero SQLQuery2.c por ejemplo, dar un cuerpo a:

	_declspec (dllexport) void SQLQuery_ponCuestion
	(struck HSQLQuery *,struct Hjava_lang_String *);

Al principio de este fichero se deberá efectuar como mínimo los include siguientes:

	include <StubPreamble.h>	
	#include "SQLQuery.h"

y rellenar el cuerpo de:

	_declspec (dllexport) void SQLQuery_ponCuestion
	(struct HSQLQuery *,struct Hjava_lang_String *) {
	/ * ... * /
	/ * fuente C a desarrollar * /
	/ * ... * /


volver


UTILIZACIÓN DEL CÓDIGO

COMPILACIÓN

Se tiene pues cuatro ficheros diferentes:

Se deberá entonces compilar los dos ficheros SQLQuery.c y SQLQuery2.c para hacer con ellos una librería dinámica, cuyo nombre es SQL, nombre que servirá para cargar la librería como lo indica la línea siguiente del fuente Java:

	System.loadLibrary ("SQL");
La realización de una librería dinámica depende del sistema operativo y del compilador. La librería dinámica necesitará ser enlazada con una librería de sistema de Java.

Por ejemplo, bajo Windows 95:

	
	cl SQLQuery.c SQLQuery2.c -FeSQ1 -MD -LD javai.lib.

Puede entonces utilizar el programa Java.

volver


Hosted by www.Geocities.ws

1