Download Present. proyec

Document related concepts
no text concepts found
Transcript
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.
Interacción desde un programa C a un programa en Java
Interacción desde un programa Java a un programa C
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 ()
{
}
public void write (int oneByte)
{
}
return ParallelPort.readOneByte (this.portBase+1);
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.