210 likes | 372 Views
Proyecto de Programación de Sistemas. “Uso de Java Native Interface para envío y recepción de datos por puerto paralelo”. Nombre: Ignacio Zamora R. Profesor: Agustín González V. Valparaíso, 19 de Noviembre. 2004. INTRODUCCIÓN.
E N D
Proyecto de Programación de Sistemas “Uso de Java Native Interface para envío y recepción de datos por puerto paralelo” Nombre: Ignacio Zamora R. Profesor: Agustín González V. Valparaíso, 19 de Noviembre. 2004
INTRODUCCIÓN Aunque las API’s de Java son poderosas para todo tipo de aplicaciones, se necesita utilizar la potencia específica de una plataforma en concreto. Java desde un principio incluyo una forma de hacer llamadas nativas desde la maquina virtual, pero tenia 2 problemas:
1. Las llamada a código nativo desde Java accedían a estructuras C, pero no estaba definida la posición exacta que debían ocupar estos campos en memoria con lo que una llamada nativa en una maquina virtual no coincidían con las llamadas en otra maquina virtual. 2. Las llamada nativas en versiones anteriores a JSDK 1.1 se basaban en el uso de un recolector de basura conservativo, este recolector recogía el puntero nativo que apuntaba a un objeto Java, por lo tanto cuando se apuntaba a un objeto Java desde el método nativo éste no se liberaba nunca más.
Debido a los problemas que se presentaron al invocar métodos nativos se implemento una nueva forma de acceder a estos métodos nativos a la que se llamo JNI. JNI es un entorno el cual nos permite ejecutar código nativo de la maquina en la cual se esta corriendo desde Java y viceversa. Código Nativo son funciones escritas en algún leguaje de programación como C o C++, donde se ejecuta la maquina virtual.
IMPLEMENTACIÓN DE JNI • Para implementar JNI se debe seguir los siguientes pasos: • Escribir el código en java • Compilar el Código Java • Crear el fichero. • Escribir la implementación del Método Nativo. • Crear una librería Compartida. • Ejecutar el programa.
ESCRIBIR EL CÓDIGO EN JAVA Se deben definir dentro de una clase Java todos los métodos Java, como los métodos nativos. Para la implementación de un método en un lenguaje de programación distinto de Java, se debe incluir la palabra clave native.
package parport; public class ParallelPort { public ParallelPort (int portBase) { this.portBase = portBase; } public int read () { return ParallelPort.readOneByte (this.portBase+1); } public void write (int oneByte) { ParallelPort.writeOneByte(this.portBase, oneByte); } public static native int readOneByte (int address); public static native void writeOneByte(int address, int oneByte); static { System.loadLibrary("parport"); } }
Para llamar a métodos nativos se hace de la misma forma que la llamada a un método normal. ParallelPort lpt1 = new ParallelPort(0x378); lpt1.write(bit); lpt1.read();
COMPILAR EL CÓDIGO JAVA Ahora se debe a compilar la clase Java anterior creada de la forma convencional. javac ParallelPort.java
CREAR EL FICHERO .H La creación del fichero .h es para proporcionar un prototipo de función para la implementación de los métodos nativos write() y read() definidos en la clase ParallelPort(). Para crear este fichero se ejecuta el comando: javah ParallelPort
Si miramos dentro del fichero .h creado nos encontramos con lo siguiente: JNIEXPORT jint JNICALL Java_parport_ParallelPort_readOneByte (JNIEnv *, jclass , jint); JNIEXPORT void JNICALL Java_parport_ParallelPort_writeOneByte (JNIEnv *, jclass , jint, jint);
ESCRIBIR LA IMPLEMENTACIÓN DEL MÉTODO NATIVO. Se debe escribir ahora la implementación del método nativo en C. En el proyecto se incluyen los siguientes ficheros de cabecera: #include <jni.h> #include <conio.h> #include "parport_ParalellPort.h"
Dentro del programa C se deben escribir las funciones con las mismas firmas de las funciones que se generaron en el fichero .h Esta función lee en el puerto paralelo y retorna el valor leído (status) a la acción que lo invoco en Java. JNIEXPORT jint JNICALL Java_parport_ParallelPort_readOneByte (JNIEnv * algo, jclass otro, jint portStatus) { unsigned short status; status = (unsigned short)portStatus; return _inp(status); }
Por otro lado esta función envía un Byte al puerto paralelo que fue enviado por una acción en el programa Java que lo invoca. JNIEXPORT void JNICALL Java_parport_ParallelPort_writeOneByte (JNIEnv * algo, jclass otro, jint portData, jint oneByte) { unsigned short data; int aByte; data = (unsigned short)portData; aByte = (int)oneByte; _outp(data,aByte); }
CREAR UNA LIBRERÍA COMPARTIDA Las librerías son ficheros que almacenan las funciones, clases y variables globales y sirve para enlazar los lenguajes. Se pueden crear librerías de enlace estático o enlace dinámico. Para el proyecto esta librería será parport.dll donde es ligada en la clase ParallelPort. System.loadLibrary("parport") Hay varias formas de crear una librería, cada compilador y sistema operativo tienen formas distintas de llevar a cabo esta acción.
EJECUTAR EL PROGRAMA Ahora queda solo ejecutar el programa Proyecto.java, pero antes hay que guardar en la carpeta classes del compilador java la carpeta con nombre parport con los archivos: parport.dll y la clase ParallelPort .java.
Al momento de ejecutar el programa de envío muestra inmediatamente un panel con cuatro botones los cuales controlan independientemente cada led.
Al ejecutar el programa de recepción de datos se mostrara una ventana que cambiara el fondo de esta al accionar el botón que se encuentra conectado al Puerto Paralelo. El fondo será azul cuando no hay pulsación del botón y rojo cuando se pulsa.