JNI (Java Native Interface)

Tamaño: px
Comenzar la demostración a partir de la página:

Download "JNI (Java Native Interface)"

Transcripción

1 Capítulo 7 JNI (Java Native Interface) 7.1. Introducción 1 La interfaz JNI (Java Native Interface) es una herramienta de Java que permite a aplicaciones escritas en Java ejecutar código nativo. Así mismo también es posible la situación inversa, la ejecución de código Java desde código nativo. Estas funcionalidades permiten a los programadores Java hacer uso de desarrollos en código nativo, ahorrando tiempo en el desarrollo de tareas específicas que en el caso de que no existiera JNI habría que reprogramar. JNI proporciona una interfaz estandarizada para el acceso a aplicaciones nativas independientemente de la implementación de la máquina virtual. Antes de entrar más en profundidad en JNI, es necesario definir algunos conceptos fundamentales para entender el papel que juega en Java: Plataforma Java: es el conjunto formado por la máquina virtual de Java (Java Virtual Machine) y su API. La API de Java consiste en una serie de clases predefinidas que realizan un gran número de tareas y sirven de base para la implementación de aplicaciones. Entorno huésped (host environment): representa el sistema operativo, un conjunto de librerías nativas y el juego de instrucciones de la CPU. Las aplicaciones nativas se escriben en lenguajes de programación nativos como C/C++, se compilan en código máquina y se enlazan con otras librerías nativas. Por todo lo anterior las aplicaciones nativas son dependientes del entorno huésped en contraposición de las aplicaciones Java que pueden ejecutarse en cualquier plataforma Java estándar. Esto se debe a que las plataformas Java se sitúan encima del entorno huesped, abstrayendo a las aplicaciones Java del entorno en el que en realidad se están ejecutando. Una vez definidos estos conceptos, en la siguiente figura se muestra la situación de JNI dentro del conjunto plataforma Java-entorno huésped. JNI se sitúa entre la implementación de la máquina virtual y la aplicación nativa, permitiendo, como ya se ha comentado anteriormente, la ejecución de código nativo desde Java y viceversa. JNI integra código Java y código nativo, soportando dos tipos de código nativo: Librería nativa: es una colección de funciones implementadas en código nativo y compiladas para una determinada máquina y sistema operativo. Es el tipo de código nativo al que puede llamar una aplicación Java desde JNI usando los llamados métodos nativos. Estos métodos permiten encapsular la llamada a librerías nativas dentro de métodos Java. 1 Este capítulo está basado en el documento JNI (Java Native Interface). Programmer s Guide and Specification.[42] 53

2 Proceso de desarrollo en JNI Figura 7.1: Contexto de JNI Aplicación nativa: JNI permite a través de su interfaz de invocación que una aplicación nativa englobe una implementación de la máquina virtual. De este modo, puede ejecutar aplicaciones Java Objetivos de JNI Los objetivos de JNI son los siguientes: 1. Compatibilidad binaria: se garantiza que las distintas implementaciones de la máquina virtual para una determinada plataforma son compatibles con el código binario de las aplicaciones nativas. Por tanto, los programadores sólo tienen que implementar una versión de las aplicaciones nativas para una plataforma determinada. 2. Eficiencia: por el hecho de estandarizar el acceso a código nativo en diferentes máquinas virtuales, se introduce cierta sobrecarga en la ejecución de los programas. JNI pretende llegar a una solución de compromiso entre eficiencia y normalización del acceso a código nativo. 3. Funcionalidad: la interfaz ofrece la suficiente información de la máquina virtual para que las aplicaciones nativas puedan realizar tareas útiles Proceso de desarrollo en JNI En este apartado se va exponer el proceso de implementación de una llamada a código nativo desde Java utilizando un método nativo, ya que es la forma más común de uso de JNI. Como ejemplo, se llamará a una librería nativa que imprimirá Hola Mundo por pantalla (en este caso la aplicación se ejecuta en un PC). A continuación se muestran los pasos a seguir: 1. Creación de una clase que declare el código nativo. En este caso HolaMundo.java 2. Compilación de la clase. 3. Uso de javah (que se encuentra en el kit de desarrollo de Java) para crear el archivo de cabecera de la librería nativa (HolaMundo.h). 4. Implementación de las funciones declaradas en el archivo de cabecera generado en el paso 3 (HolaMundo.c). 5. Compilación de la librería nativa. La librería generada debe ser dinámica, por lo que la extensión del archivo debe ser.so (linux), dylib (Mac Os X) o.dll (Windows). 6. Ejecución de la clase que llama al código nativo.

3 7. JNI (Java Native Interface) Declaración del método nativo y compilación de la clase Dentro de la clase HolaMundo.java, se declara el método nativo imprime: class HolaMundo { private native void imprime (); public static void main ( String [] args ) { new HolaMundo (). imprime (); static { System. loadlibrary (" HolaMundo "); Se puede observar que el método imprime tiene dos diferencias evidentes con respecto a la declaración de métodos que se suele realizar en Java. Una primera diferencia es el uso del modificador native. El modificador native debe estar presente en la declaración de todos los métodos nativos. Una segunda diferencia es que no se implementa el método, ya que la implementación se produce en la librería nativa. Por otra parte, existe un bloque de código con el modificador static. Esto indica a la máquina virtual que el bloque en cuestión debe ejecutarse en primer lugar. La utilidad del modificador static en esta clase es asegurarse de que la librería nativa se va a cargar mediante la llamada de System.loadLibrary antes de que se haga referencia a ella en la llamada a imprime. Una vez implementada la clase se pasa a compilarla, mediante la SDK, resultando el fichero HolaMundo.class Creación del fichero de cabecera El archivo de cabecera de la librería nativa se genera a través de la herramienta javah, como se explico anteriormente: javah HolaMundo El archivo generado se llama HolaMundo.h. En el caso en el que la clase que se diera como entrada perteneciera a un paquete, como por ejemplo prueba.jni, el archivo de cabecera resultante sería prueba_jni_holamundo.h. En cuanto al contenido del archivo de cabecera, en este caso sólo contiene la declaración de una función: JNIEXPORT void JNICALL Java_ HolaMundo_ imprime ( JNIEnv *, jobject ); En esta declaración se pueden observar dos macros (JNIEXPORT y JNICALL) y dos argumentos de entrada ( un puntero a JNIEnv y jobject). Estos cuatro elementos se verán más adelante, aunque cabe señalar que jobject representa el objeto que realiza la llamada al método nativo, en este caso una instancia de la clase HolaMundo. Los nombres de los métodos nativos se determinan anteponiendo el prefijo Java_ más el nombre completo de la clase (incluyendo el paquete al que pertenece) y el nombre del método, separando las palabras por el caracter _ en vez de por puntos, como ocurre en Java. De esta forma, el método imprime perteneciente a la clase ejemplo.jni.holamundo se declara en el fichero de cabecera como Java_ejemplo_jni_HolaMundo_imprime Implementación y compilación del método nativo La implementación del método nativo se muestra seguidamente: # include <jni.h> # include <stdio.h> # include " HelloWorld. h"

4 Tipos de datos y funciones de trasformación JNIEXPORT void JNICALL Java_ HolaMundo_ imprime ( JNIEnv * env, jobject obj ) { printf (" Hola Mundo \n "); return ; Entre los ficheros de cabecera utilizados se encuentra jni.h. Este archivo contiene las definiciones de todas las funciones, tipos y macros que se necesitan para implementar un método nativo. Debido a la sencillez de este ejemplo, es posible ignorar los argumentos de entrada de la función. Como se dijo en el apartado anterior, más tarde se explicará la utilidad de estos argumentos. Una vez implementado el método nativo, se procede a su compilación, utilizando el compilador más adecuado para el tipo de máquina y sistema operativo. Como ya se comentó, el resultado de la compilación debe ser una librería dinámica para poder cargarla desde código Java mediante System.load.Library Ejecución del programa Si ahora se ejecuta la aplicación Java, debe imprimirse en la consola Hola Mundo. Se debe poner atención en definir correctamente la variable de entorno para las librerías nativas. Esta variable de entorno indica a la máquina virtual dónde tiene que buscar las librerías que tiene que cargar. En sistemas Windows ésta debe estar en el directorio actual o en alguno de los directorios definidos en la variable PATH. Además de los directorios definidos en PATH, se puede definir dentro de la llamada al lanzador de aplicaciones (java para el JRE de Sun) el directorio donde buscar librerías nativas, estableciento la propiedad java.library.path: java - Djava. library. path =C:\ librerias HolaMundo 7.3. Tipos de datos y funciones de trasformación En el ejemplo anterior no se pasaba ningún argumento a la función nativa. Pero esto no siempre va a ser así. En este apartado se detalla la correspondencia entre los tipos en Java y en JNI así como las funciones que permiten obtener cadenas de caracteres en C partiendo de objetos String. Antes de explicar estos tipos y funciones, es preciso aclarar cómo se produce la llamada a métodos nativos desde Java. Para ello se vuelve a recordar la definición del método nativo imprime, visto en el apartado anterior: JNIEXPORT void JNICALL Java_ HolaMundo_ imprime ( JNIEnv * env, jobject obj ) { printf (" Hola Mundo \n "); return ; Las macros JNIEXPORT y JNICALL garantizan que la función se va a exportar en la librería, y que el compilador generará el código siguiendo el formato de llamada correcto. El argumento env es un puntero a la interfaz JNIEnv. La interfaz JNIEnv contiene un puntero a una tabla de funciones. Cada una de las entradas de esta tabla representa una función de JNI. A través de las funciones de JNI, un método nativo puede acceder a los objetos y métodos de Java. En Java los tipos de datos se dividen en tipos primitivos (int, float o char, por ejemplo) y referenciados, como clases, objetos y cadenas. En JNI los tipos primitivos de Java tienen su propia definición. Por ejemplo un int en java se coresponde en JNI a un jint (que se define como un entero de 32 bits) y un float a un jfloat. Las cadenas de caracteres en Java (java.lang.string) se coresponden con el tipo jstring, que como todos los objetos en Java son pasados a los métodos

5 7. JNI (Java Native Interface) 57 nativos como referencias opacas. Una referencia opaca es un tipo de puntero que apunta a estructuras internas de la máquina virtual de Java. El programador, por tanto, no tiene acceso a estas estructuras, por lo que para obtener los valores de dichas referencias debe hacer uso de las funciones que ofrece JNI. En los siguientes apartados se mostrarán algunas de estas funciones, empezando por las referentes a la conversión de objetos String a cadenas de caracteres en C así como a la creación de objetos String desde código nativo Conversión y creación de cadenas de caracteres En JNI es posible convertir los objetos jstring en cadenas de caracteres en C, tanto UTF-8 como Unicode. El siguiente método nativo imprimecadena, es una extensión del método imprime visto en el primer ejemplo. En este caso, el método nativo imprime la cadena que se le pasa como argumento desde Java. JNIEXPORT jint JNICALL Java_ HolaMundo_ imprimecadena ( JNIEnv * env, jobject obj, jstring cadena ) { char * mensaje ; jint resultado ; /** conversion de la cadena **/ mensaje = (* env )- > GetStringUTFChars ( env, cadena, NULL ); if( mensaje!= NULL ) { printf (" %s\n", mensaje ); /** liberación de la cadena nativa **/ (* env )-> ReleaseStringUTFChars (env, cadena, mensaje ); resultado = 0; else { resultado = 1; return resultado ; La función GetStringUTFChars convierte la cadena de caracteres Unicode que representa el tipo jstring a una cadena en formato UTF-8 en C. Como se puede observar, es importante comprobar que realmente se ha producido la conversión de la cadena, ya que puede ocurrir que no haya suficiente memoria para construir la cadena de caracteres en C. Cuando se ha terminado de utilizar la cadena convertida, es necesario liberar la memoria utilizada para almacenarla con la función ReleaseStringUTFChars. En JNI, además de la conversión de cadenas de caracteres es posible la creación de objetos jstring desde código nativo, usando la función NewStringUTF, cuya definición se presenta a continuación: jstring NewStringUTF ( JNIEnv * env, const char * bytes ); Donde bytes representa la cadena de caracteres de C/C++ en formato UTF-8 que se desea convertir en un objeto jstring. Si no hay memoria suficiente para crear el objeto, se genera la excepción OutOfMemoryError. En las funciones que se acaban de explicar, las cadenas en C/C++ están en formato UTF-8. Para los sistemas operativos que permiten cadenas en formato Unicode, existen unas variantes de las funciones anteriores, que se detallan en la siguiente tabla: Cadenas UTF-8 GetStringUTFChars ReleaseStringUTFChars NewStringUTF Cadenas Unicode GetStringChars ReleaseStringChars NewString

6 Tipos de datos y funciones de trasformación Acceso a cadenas En el caso de que se pasen como argumento a una función nativa cadenas de tipos primitivos o referenciados, estas se representan como algún subtipo de jarray. Entre los subtipos de jarray se encuentran entre otros jintarray, jbytearray o jobjectarray. Estas cadenas no pueden ser gestionadas directamente por el código nativo. En su lugar, es preciso utilizar funciones que permitan convertirlas en cadenas de C/C++, tal y como se muestra en el método nativo sumacadena: JNIEXPORT jint JNICALL Java_ IntArray_ sumacadena ( JNIEnv * env, jobject obj, jintarray arr ) { jint * buf ; jint length ; jint i, sum = 0; length = (* env )-> GetArrayLength (env, arr ); buf = ( jint *) malloc ( sizeof ( jint )* length ); (* env )-> GetIntArrayRegion (env, arr, 0, length, buf ); for ( i = 0; i < length ; i ++) { sum += buf [i]; free ( buf ); return sum ; Para calcular el tamaño del buffer se utiliza GetArrayLength, y tras reservar la memoria se llama a la función Get<Tipo>ArrayRegion, que es la encargada de copiar length elementos, desde la posición inicial (0). Además de la función Get<tipo>ArrayRegion, se puede utilizar Get<tipo>ArrayElements, con lo cual se logra no tener que conocer la longitud de la cadena en Java para reservar la memoria, ya que la función la reserva por el programador. Para liberar la memoria reservada por JNI, se usa la función Release<tipo>ArrayElements. Para modificar cadenas de tipos primitivos desde código nativo se utiliza la función Set<Tipo>ArrayRegion, que consiste básicamente en la función inversa a Get<Tipo>ArrayRegion. Si lo que se desea es crear cadenas de Java desde código nativo, se debe hacer uso de la función New<Tipo>Array, función a la que es necesario pasarle la cadena nativa así como su longitud Acceso a campos de objetos Una vez que ya se ha descrito cómo acceder a tipos primitivos y cadenas, se procede ahora a detallar las herramientas disponibles en JNI para acceder a los campos de cualquier instancia de una clase. Para poder acceder a los campos de un objeto, es necesario completar los siguientes pasos: 1. Conocer la clase a la que pertenece el objeto. Esta operación se realiza mediante la llamada a GetObjectClass. 2. Extraer los identificadores de los campos a los que se desean acceder. Los campos se acceden en JNI usando identificadores de campo, definidos como variables jfieldid. Estos identificadores se obtienen a través de la invocación de la función GetFieldID. 3. Acceder a los campos mediante los identificadores extraídos. Este acceso se produce a través de la llamada a GetObjectField. Se ilustran estos pasos mediante la clase Sumador que se define de la siguiente forma:

7 7. JNI (Java Native Interface) 59 class Sumador { int a; /* primer sumando */ int b; /* segundo sumando */ int resultado ; private native void suma (); public static void main ( Sring args []){ Sumador sumador = new Sumador (); sumador. a = 2; sumador. b = 5; sumador. suma (); System. out. println ( sumador.a + "+" + sumador.b + "=" + sumador. resultado ); static { System. loadlibrary (" sumalib "); Donde la definición del método nativo Java_Sumador_suma es: JNIEXPORT void JNICALL Java_ Sumador_ suma ( JNIEnv * env, jobject obj ){ jint a, b, resultado ; jfieldid a_fid, b_fid, res_fid ; jclass cls ; cls = (* env )-> GetObjectClass (env, obj ); a_fid = (* env )-> GetFieldID (env, cls,"a","i "); if( a_fid!= NULL ) { b_fid = (* env )-> GetFieldID (env,cls,"b","i "); if( b_fid!= NULL ) { res_fid =(* env )-> GetFieldID (env,cls," resultado ","I "); if( res_fid!= NULL ){ return ; a = (* env )-> GetIntField (env, a_fid ); b = (* env )-> GetIntField (env, b_fid ); resultado = a + b; (* env )-> SetIntField (env, obj, res_fid, resultado ); En JNI, el identificador del campo se obtiene mediante GetFieldID, indicando la clase a la que pertenece el objeto, el nombre del campo y el descriptor del campo. El descriptor del campo es la forma de identificar el tipo (ya sea primitivo o referenciado) del campo. En la siguiente tabla se muestra la correspondencia entre los tipos primitivos y su descriptor:

8 Tipos de datos y funciones de trasformación Tipo boolean byte char short int long float double Descriptor de Campo Z B C S I L F D Si se quiere obtener el identificador de un campo de tipo referenciado, se utiliza el nombre completo de la clase, iniciando el nombre con el caracter L, sustituyendo el caracter separador. por / y finalizando la cadena con ;. Por ejemplo, si se quiere acceder a un campo String, el descriptor es Ljava/lang/String;. Si lo que se desea es obtener el identificador de una tabla, se utiliza el prefijo [. Por ejemplo, en el caso del acceso a una tabla de enteros, el descriptor sería [I Llamada a métodos de objetos Desde código nativo también es posible realizar llamadas a métodos de objetos. Esto se realiza de manera similar a como se accede a los campos: 1. Se averigua la clase a la que pertenece el objeto mediante la función GetObjectClass. 2. Se extrae el identificador del método (representado por jmethodid) a través de la llamada a la función GetMethodID. 3. Se ejecuta el método llamando a la función que corresponda dentro de la familia de funciones Call<Tipo>Method. Para mostar estos pasos, se define la clase Escritor que cuenta con los métodos escribe e imprimemensaje: class Escritor { private native void escribe ( String fichero, String texto ); void imprimemensajeerror (){ System. out. println ( Error al abrir el archivo ); public static void main ( String args []){ Escritor escritor = new Escritor (); escritor. escribe (/ directorio / fichero1.txt, Hola Mundo ); static { System. loadlibrary (" escribelib "); El método escribe es un método nativo al que se le pasan dos argumentos, uno es el texto que se desea escribir y el otro el fichero donde se guardará el texto escrito. Se muestra a continuación la definición de la función Java_Escritor_escribe: JNIEXPORT void JNICALL Java_ Escritor_ escribe ( JNIEnv * env, jobject * obj, jstring fichero, jstring texto ){

9 7. JNI (Java Native Interface) 61 char * texto_ nativo ; char * fichero_ nativo ; FILE * descriptor ; jclass cls ; jmethodid imprime_ id ; texto_nativo = (* env )-> GetStringUTFChars (env, texto, NULL ); if( texto_ nativo!= NULL ){ fichero_nativo = (* env )-> GetStringUTFChars (env, fichero, NULL ); if( fichero_ nativo!= NULL ){ descriptor = fopen ( fichero_nativo, wb ); if( descriptor!= NULL ){ fprintf ( descriptor, %s\n, texto_nativo ); fclose ( descriptor ); else { cls = (* env )-> GetObjectClass ( obj ); imprime_id = (* env )-> GetMethodID (env,cls, imprimemensajeerror,() V); if( imprime_ id!= NULL ){ (* env )-> CallVoidMethod (env,obj, imprime_id ); Como se puede observar, dentro del método nativo escribe, si se falla al abrir el fichero se llama al método imprimemensajeerror. En el proceso de obtención del identificador del método se llama a la función GetMethodID con tres argumentos: el primer argumento es el puntero a JNIEnv, el segundo el objeto que contiene el método al que se pretende llamar y en último lugar se pasa el descriptor del método. Los descriptores de los métodos son similares a los descriptores de campos, ya explicados. En el caso de los descriptores de métodos, se diferencia el tipo devuelto y los que se pasan como parámetros. Los tipos de los argumentos se describen entre parántesis, y seguidamente se especifica el tipo que devuelve. De este modo, si una función no toma ningún argumento y devuelve un entero, su descriptor es ()I. En cambio, si se le pasa como argumento un String y devuelve un entero, entonces sería (Ljava/lang/String;)I. Para ahorrarse la aplicación de estas reglas a cada método que se desee acceder, es posible utilizar la aplicación javap de la SDK de Java. Esta aplicación ejecutada con la opción -s desglosa los nombres de los campos y métodos contenidos en un fichero.class, junto con sus descriptores Construcción de objetos En JNI también es posible la instanciación de clases. La instanciación de clases es de utilidad cuando en la función nativa se devuelve una variable de tipo referenciado. Para la instanciación de objetos en código nativo es necesario seguir los siguientes pasos: 1. Obtención de la clase que se pretende instanciar, almacenándola en una variable de tipo jclass. Para ello, si no se dispone de un objeto instanciado almacenado en una variable jobject, se puede utilizar la función FindClass, que necesita el nombre completo de la clase.

10 Construcción de objetos 2. Creación del objeto mediante la función NewObject. NewObject reserva memoria para el objeto y llama a uno de sus constructores. Para llamar un constructor concreto, primero ha de extraerse su identificador mediante GetMethodID, determinando como nombre del método <init> y como tipo devuelto V. En la siguiente función creacadena, se ilustra el procedimiento que se acaba de explicar. La funcionalidad de creacadena es emular a la función NewString, que como ya se ha comentado crea un objeto String pasándole una cadena de caracteres Unicode de C. jstring creacadena ( JNIEnv * env, jchar * chars, jint len ) { jclass clasestring ; jmethodid cid ; jchararray cadena ; jstring resultado ; /* obtencion de la clase y el constructor de String */ clasestring = (* env )-> FindClass (env, " java / lang / String "); if ( stringclass == NULL ) { return NULL ; cid = (* env )-> GetMethodID (env, clasestring, "<init >", "([ C)V "); if ( cid == NULL ) { return NULL ; /* construccion de la cadena de caracteres */ cadena = (* env )-> NewCharArray (env, len ); if ( cadena == NULL ) { return NULL ; (* env )-> SetCharArrayRegion (env, cadena, 0, len, chars ); /* construccion del objeto String */ resultado = (* env )- > NewObject ( env, clasestring, cid, cadena ); (* env )-> DeleteLocalRef (env, cadena ); (* env )-> DeleteLocalRef (env, clasestring ); return resultado ; En el ejemplo, primero se ha construido una cadena de caracteres Java (cadena) para después llamar al contructor de la clase String que toma como argumento la cadena que se acaba de construir, mediante la inclusión del identificador del contructor y de la cadena de elementos char como argumentos de NewObject. La obtención del identificador del constructor (en la que se utiliza la función GetMethodID), puede servir como ejemplo de lo explicado en el paso dos. Finalmente se liberan las referencias locales que se han usado durante la creación del objeto String (clasestring y cadena) usando las función DeleteLocalRef. Llegado a este punto resulta conveniente definir los tipos de referencias en JNI. Como se explicó en el apartado 7.3, los tipos referenciados se gestionan en JNI como referencias opacas. Estas referencias se dividen en tres tipos según sus características. Las referencias más comunes son las referencias locales. Las referencias locales sólo tienen validez dentro de la función nativa que las ha definido y no se conserva su valor entre sucesivas llamadas al método. Esto significa que es inútil retener el valor de una referencia local declarándola como variables estática, ya que la máquina virtual se encarga de liberar los recursos a los que apunta la referencia local cada vez que se termina la ejecución del método nativo. Las variables locales, por tanto, son liberadas automáticamente por la máquina virtual. No obstante, pueden liberarse las referencias locales explícitamente mediante la función DeleteLocalRef.

11 7. JNI (Java Native Interface) 63 En el otro extremo se encuentran las referencias globales, que son creadas partiendo de una referencia local a través de la llamada a la función NewGlobalReference. Este tipo de referencias no puede ser liberado por la máquina virtual, lo que permite que se puedan almacenar entre ejecuciones de un determinado método nativo sin que se produzcan incoherencias. Por otro lado, dado que este tipo de referencias no se pueden liberar automáticamente, se hace necesaria para su liberación la llamada a la función DeleteGlobalReference. Por último, existe un tercer tipo de referencia llamada referencia global débil. Una referencia global débil no se libera cuando termina la ejecución del método nativo, auque sí se libera el objeto Java subyacente. Esta clase de referencias son útiles para los casos en que se quiera conservar la referencia pero no mantener el objeto cargado en la máquina virtual, como por ejemplo cuando se desea conservar la referencia a una clase entre ejecuciones del método o en distintos hilos. Por lo tanto, es posible que en sucesivas ejecuciones de un método nativo, una referencia global débil apunte a un objeto que ya ha sido destruido por la máquina virtual. Para estos casos, así como para comprobar que dos referencias cualquiera apuntan al mismo objeto, se utiliza la función IsSameObject. Por ejemplo, si se tienen dos referencias locales (obj1 y obj2) que puede que referencien al mismo objeto, se usaría IsSameObject de la siguiente forma: (* env )-> IsSameObject (env,obj1, obj2 ); El valor devuelto por la función será JNI_TRUE si referencian al mismo objeto y JNI_FALSE en otro caso. Si lo que se intenta es saber si una referencia local o global (por ejemplo obj1) apunta a un objeto ya liberado, la llamada a IsSameObject se realiza de esta forma: (* env )-> IsSameObject (env,obj1, NULL ); Obteniendo JNI_TRUE si obj1 referencia a un objeto ya liberado y JNI_FALSE si todavía se mantiene vivo. Esto es equivalente a escribir: obj1 == NULL Esto es así porque el hecho de que una variable global ya no apunte a un objeto cargado en memoria es equivalente a la liberacioón de la referencia, y por tanto el valor se ha puesto a NULL. Para la comprobación de que una variable local débil aún hace referencia a un objeto Java válido se utiliza IsSameObject de forma análoga al caso anterior : (* env )-> IsSameObject (env, obj_debil, NULL ); La llamada a esta función es necesaria para conocer si se ha liberado el objeto al que apunta obj_debil ya que las variables globales débiles no se liberan automáticamente y por tanto conservan el valor aunque ya se haya liberado el objeto al que apuntaban Hilos y JNI Como es sabido, Java permite la ejecución de múltiples hilos dentro de un proceso. Por lo tanto, es necesario disponer de una serie de funcionalidades que permitan a los programadores gestionar los hilos de una manera parecida en como se hace en Java. En los siguientes apartados se describirán estas herramientas así como las limitaciones que existen en cuanto al uso de las variables de JNI entre distintos hilos Restricciones En un entorno multihilo, en JNI existen una serie de limitaciones que se han de tener en cuenta a fin de que varios hilos puedan ejecutar un método nativo simultánamente: El puntero a JNIEnv no puede pasarse de un hilo a otro, ya que cada JNIEnv está asociado al hilo en el que fue creado.

12 Hilos y JNI Las variables locales no se pueden conservar de un hilo a otro, porque al cambiar de hilo las variables locales pierden su valor. Para pasar una variable local a otro hilo, es necesario convertirla a global Obtención del puntero a JNIEnv Como se acaba de explicar, los punteros a JNIEnv no se pueden pasar entre hilos, ya que su valor está ligado al hilo en el que se crearon. No obstante hay circunstancias que requiren la obtención del puntero a JNIEnv en otro hilo distinto al del método nativo llamado por la aplicación Java. Un ejemplo típico es el paso de una función que haga uso de JNI como callback 2 de una función nativa. En ese caso, la función no es llamada desde Java, pero en cambio sí necesita el puntero a JNIEnv para poder ejecutarse con éxito. Para estos casos se utiliza la función AttachCurrentThread de la interfaz de invocación (tipo JavaVM). La interfaz de invocación permite cargar la máquina virtual desde código nativo, pasándole los parámetros correspondientes, como se hace al ejecutar la aplicación java. Así pues, es necesaria la obtención del puntero JavaVM para poder obtener el puntero a JNIEnv El uso de AttachCurrentThread se ilustra a continuación:... JavaVM *vm; JavaVMAttachArgs args ;... /* Obtención de vm */... args. version = JNI_VERSION_1_2 ; args. name = NULL ; args. group = NULL ; vm -> AttachCurrentThread (jvm, ( void **)& env, & args ) /* Llamadas a las funciones de JNI usando env */... La obtención del puntero a JavaVM se puede conseguir de diversas formas: mediante la llamada a la función JNI_GetCreatedJavaVMs o dentro de un método nativo usando la función GetJavaVM. El puntero a JavaVM obtenido se puede almacenar para que pueda ser usado en otros hilos, ya que el VM conserva su validez entre hilos distintos. En cuanto a la función AttachCurrentThread, tiene como argumentos de entrada el puntero a la máquina virtual y una estructura llamada JavaVMAttachArgs. Esta estructura cuenta con los campos version, name y group. La version indica la versión de la interfaz JNIEnv que se desea obtener, siendo las opciones JNI_VERSION_1_1 y JNI_VERSION_1_2. El campo name por su parte, especifica el nombre del hilo Java (es decir una instancia de java.lang.thread) que se creará. Si no se desea poner un nombre al hilo se establece name a NULL. Finalmente group indica al grupo en el que se desea adscribir el hilo que se va a crear. Una vez obtenido el puntero a JNIEnv, se pueden realizar las llamadas a las funciones que se han explicado a lo largo de este capítulo. 2 Un callback es una función que se pasa a otra como argumento, para que esta última llame a la primera cuando lo considere necesario.

Introducción a Java. Dr. (c) Noé Alejandro Castro Sánchez

Introducción a Java. Dr. (c) Noé Alejandro Castro Sánchez Introducción a Java Dr. (c) Noé Alejandro Castro Sánchez Programas Java Applets Pueden correr en navegadores Web Agregan funcionalidad a páginas Web Se llega a restringir su funcionalidad (e. g., no pueden:

Más detalles

TutorJava recomienda...

TutorJava recomienda... TutorJava recomienda... Utilizar el Java Native Interface (JNI) Autor-Traductor: Juan Antonio Palos (Ozito) Puedes encontrar la Version Original en Ingles en ( http://java.sun.com) Leer comentarios (0)

Más detalles

Estructura de Datos Unidad 1: Repaso del Lenguaje Java

Estructura de Datos Unidad 1: Repaso del Lenguaje Java Estructura de Datos Unidad 1: Repaso del Lenguaje Java Introducción Java es un lenguaje de programación orientado a objetos, desarrollado por Sun Microsystems a principios de 1991, con el que se van a

Más detalles

Práctica 2. Reutilización de código Elementos básicos del lenguaje Java Definición de variables, expresiones y asignaciones

Práctica 2. Reutilización de código Elementos básicos del lenguaje Java Definición de variables, expresiones y asignaciones Práctica 2 Reutilización de código Elementos básicos del lenguaje Java Definición de variables, expresiones y asignaciones Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos

Más detalles

Capítulo 3. Introducción a la programación. Continuar

Capítulo 3. Introducción a la programación. Continuar Capítulo 3 Introducción a la programación Continuar Introducción Java es un lenguaje que tiene muchas ventajas frente a otros lenguajes de programación: es open source (código abierto), esto permite ver

Más detalles

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones Unidad Didáctica 2 Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Versión 1.0.3 Índice

Más detalles

PROGRAMACIÓN EN JAVA. { una línea para definir, crear o ejecutar ; }

PROGRAMACIÓN EN JAVA. { una línea para definir, crear o ejecutar ; } PROGRAMACIÓN EN JAVA { una línea para definir, crear o ejecutar ; } JFC Y API SPECIFICATIONS OBJECT INTERFACE ABSTRACT IMPLEMENTS EXTENDS NEW EXTENDS (Hasta que una clase derivada deje de ser ABSTRACT)

Más detalles

Estructura de datos y Programación

Estructura de datos y Programación Estructura de datos y Programación Tema: Conceptos Básicos- Estructuras de control - Arreglos Ing. Analia Méndez Ing. Raquel Zarco Año: 2012 ELEMENTOS DE UN PROGRAMA EN JAVA El programa Java consta de

Más detalles

JNI: Java Native Interface

JNI: Java Native Interface JNI: Java Native Interface Acerca de este documento Este documento es un tutorial de JNI (Java Native Interface), el mecanismo que permite ejecutar funciones C y C++ desde Java. El tutorial supone que

Más detalles

Clases y Objetos en Java. ELO329: Diseño y Programación Orientados a Objetos

Clases y Objetos en Java. ELO329: Diseño y Programación Orientados a Objetos Clases y Objetos en Java ELO329: Diseño y Programación Orientados a Objetos Construyendo clases nuevas La forma más simple de una clase en Java es: Class Nombre_de_la_Clase { } /* constructores */ /* métodos

Más detalles

Introducción a Java. Fernando Cerezal López. 24 Noviembre 2005

Introducción a Java. Fernando Cerezal López. 24 Noviembre 2005 24 Noviembre 2005 disponibles de acceso public private protected de tipo static abstract final modificadores más avanzados que no vamos a ver... Clase Sintaxis modificadores class nombreclase{} Tipos primitivos

Más detalles

Examen Teórico. Convocatoria de Febrero de 2015

Examen Teórico. Convocatoria de Febrero de 2015 Examen Teórico Convocatoria de Febrero de 2015 Nombre: DNI: Grupo: 1. Contesta de forma razonada a las siguientes cuestiones relacionadas con los ficheros.jar: a) Para qué se utilizan los ficheros con

Más detalles

Presentación del Curso Presencial. Programación en Java Nivel Básico

Presentación del Curso Presencial. Programación en Java Nivel Básico Presentación del Curso Presencial Programación en Java Nivel Básico Tabla de contenido Presentación del curso... 3 Objetivos de aprendizaje... 6 Contenidos del curso... 7 Competencias previas... 9 Recursos...

Más detalles

Carlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas

Carlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas 2 - Introducción al lenguaje Java, identificadores y comentarios. Carlos Montenegro Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas 1. Introducción: Java tiene como todos

Más detalles

Datos Elementales y formato de un programa en Java

Datos Elementales y formato de un programa en Java Datos Elementales y formato de un programa en Java PROGRAMACION I Grado en Matematicas Informática Programación I - 2015/2016 Datos, variables y mi primer programa 1 Introducción a la programación o Programa:

Más detalles

Introducción a Java LSUB. 30 de enero de 2013 GSYC

Introducción a Java LSUB. 30 de enero de 2013 GSYC Introducción a Java LSUB GSYC 30 de enero de 2013 (cc) 2013 Laboratorio de Sistemas, Algunos derechos reservados. Este trabajo se entrega bajo la licencia Creative Commons Reconocimiento - NoComercial

Más detalles

Programación Orientada a Objetos en C++

Programación Orientada a Objetos en C++ Unidad I Programación Orientada a Objetos en C++ Programación Orientada a Objetos en C++ Programación I - 0416202 Contenido Esta lección abarca los siguientes temas: Estructura y declaración de una clase

Más detalles

Unidad V. Ya veremos qué poner en "algunas_palabras" y "algo_más", por ahora sigamos un poco más.

Unidad V. Ya veremos qué poner en algunas_palabras y algo_más, por ahora sigamos un poco más. Implementación Orientada a Objetos. Unidad V 5.1 Estructura de una clase. Una clase consiste en: algunas_palabras class nombre_de_la_clase [algo_más] { [lista_de_atributos] [lista_de_métodos] Lo que está

Más detalles

ESTRUCTURA DE DATOS. Memoria estática Memoria dinámica Tipo puntero Declaración de punteros Gestión de memoria dinámica Resumen ejemplo

ESTRUCTURA DE DATOS. Memoria estática Memoria dinámica Tipo puntero Declaración de punteros Gestión de memoria dinámica Resumen ejemplo ESTRUCTURA DE DATOS Memoria estática Memoria dinámica Tipo puntero Declaración de punteros Gestión de memoria dinámica Resumen ejemplo DATOS ESTÁTICOS Su tamaño y forma es constante durante la ejecución

Más detalles

B: El Interfaz Nativo Java (JNI 1 )

B: El Interfaz Nativo Java (JNI 1 ) B: El Interfaz Nativo Java (JNI 1 ) El material de este apéndice se incorporó y usó con el permiso de Andrea Provaglio (www.andreaprovaglio.com). El lenguaje Java y su API estándar son lo suficientemente

Más detalles

Docente: Juan Carlos Pérez P. Alumno : Fecha : Nota:

Docente: Juan Carlos Pérez P. Alumno : Fecha : Nota: Docente: Juan Carlos Pérez P. Alumno : Fecha : Nota: Justificación: Se pretende con éste contribuir a que el alumno se inicie y conozca el entorno del IDE en la creación de pequeños programas en java Objetivos:

Más detalles

Algoritmos y Estructuras de Datos Ingeniería en Informática, Curso 2º SEMINARIO DE C++ Sesión 2

Algoritmos y Estructuras de Datos Ingeniería en Informática, Curso 2º SEMINARIO DE C++ Sesión 2 Algoritmos y Estructuras de Datos Ingeniería en Informática, Curso 2º SEMINARIO DE C++ Sesión 2 Contenidos: 1. Definición de clases 2. Implementación de los métodos 3. Constructores y destructores 4. Objetos

Más detalles

Conceptos a tratar. Fundamentos de la Programación Orientada a Objetos Ampliación sobre clases y objetos

Conceptos a tratar. Fundamentos de la Programación Orientada a Objetos Ampliación sobre clases y objetos Fundamentos de la Programación Orientada a Objetos Ampliación sobre clases y objetos Programación Orientada a Objetos Facultad de Informática Dep. Ingeniería del Software e Inteligencia Artificial Universidad

Más detalles

ENTRADA/SALIDA. Relación Programa - Sistema Operativo - Hardware

ENTRADA/SALIDA. Relación Programa - Sistema Operativo - Hardware ENTRADA/SALIDA UPCO ICAI Departamento de Electrónica y Automática 1 Relación Programa - Sistema Operativo - Hardware Mi programa no maneja directamente el hardware El sistema operativo es el que maneja

Más detalles

Concurso: Cuánto sabes de JAVA?

Concurso: Cuánto sabes de JAVA? Concurso: Cuánto sabes de JAVA? Motivación: o Para cambiar el ritmo de las jornadas y que no todas las actividades sean charlas o Recordar conocimientos y aprender algo nuevo. o Las preguntas pueden ayudarnos

Más detalles

Arquitecturas cliente/servidor

Arquitecturas cliente/servidor Arquitecturas cliente/servidor Creación de Sockets Cliente Servidor 1 Creación de Sockets Cliente/Servidor Sockets en TCP Concepto de Hilos Definición de DAEMON Sockets en UDP 2 THREADS 3 Qué es un thread?

Más detalles

abril de 2017 Desarrollo de aplicaciones en Java Tipos de datos primitivos Tipos de datos Elementos de aplicaciones simples

abril de 2017 Desarrollo de aplicaciones en Java Tipos de datos primitivos Tipos de datos Elementos de aplicaciones simples Desarrollo de aplicaciones en Java Generación de código fuente Compilación Ejecución Elementos de aplicaciones simples EII147-01-02 Introducción a las tecnologías de información Escuela de Ingeniería Industrial

Más detalles

Procesos e Hilos en C

Procesos e Hilos en C Procesos e Hilos en C 6 de febrero de 2012 En esta sesión vamos a escribir programas en lenguaje C que utilicen hilos y procesos para comparar el rendimiento del sistema ante la gestión de unos y otros.

Más detalles

Tema 2: Programación basada en Objetos

Tema 2: Programación basada en Objetos Tema 2: Programación basada en Objetos Programación Orientada a Objetos Marcos López Sanz Máster en Informática Gráfica, Juegos y Realidad Virtual Índice Objetivos Introducción Vista Pública Clases Objetos

Más detalles

Funciones Definición de función

Funciones Definición de función Funciones Definición de función Una función es un bloque de código que realiza una tarea específica. Una función es una porción de programa, identificable mediante un nombre, que realiza determinadas tareas

Más detalles

INTRODUCCIóN A LA PROGRAMACIóN APUNTES DE JAVA APUNTES DE JAVA

INTRODUCCIóN A LA PROGRAMACIóN APUNTES DE JAVA APUNTES DE JAVA APUNTES DE JAVA FUNCIONAMIENTO DE UN PROGRAMA Assembler Ensamblador Ejecuta Programador Programa fuente BASIC Interprete Ejecuta C, C++, Pascal Compilador Compila Ejecuta Programa fuente Programa Objeto

Más detalles

Informática PRÀCTICA 9 Curs Práctica Nº 9: Rango y precisión de representación de números en el ordenador.

Informática PRÀCTICA 9 Curs Práctica Nº 9: Rango y precisión de representación de números en el ordenador. Departamento de Práctica Nº 9: Rango y precisión de representación de números en el ordenador. Uso de punteros Objetivos de la práctica: - Entender la representación de números (enteros y reales) en el

Más detalles

UNIDAD 2 Descripción de un programa

UNIDAD 2 Descripción de un programa Descripción de un programa Estructura general de un programa. Elementos básicos. Tipos de datos simples: enteros, reales y carácter. Representación de datos en memoria. Operaciones sobre tipos de datos

Más detalles

Estructura de un programa en Java. Tipos de datos básicos. class miprimerprograma{ // comentario, no es parte del programa

Estructura de un programa en Java. Tipos de datos básicos. class miprimerprograma{ // comentario, no es parte del programa Contenido Estructura de un programa en Java... 2 Tipos de datos básicos... 2 Operadores... 3 Literales... 4 Entrada / Salida... 4 Sentencias condicionales... 5 Funciones... 5 Ejercicios... 6 Variables,

Más detalles

Java. Introducción a la Programación Orientada a Objetos

Java. Introducción a la Programación Orientada a Objetos Java Java es un lenguaje de programación presentado en 1995 enfocado a: soportar los fundamentos de la programación orientada a objetos. generar código independiente de la arquitectura de la computadora

Más detalles

4/14/2010. Objetivos. Que es JAVA. JAVA como plataforma. Reglas Sintácticas y de Codificación Básicas de JAVA

4/14/2010. Objetivos. Que es JAVA. JAVA como plataforma. Reglas Sintácticas y de Codificación Básicas de JAVA Reglas Sintácticas y de Codificación Básicas de JAVA Objetivos Que el alumno pueda: Identificar claramente los componentes del Lenguaje y su proceso de ejecución. Identificar y comprender las partes de

Más detalles

Tema 18: Memoria dinámica y su uso en C

Tema 18: Memoria dinámica y su uso en C Tema 18: Memoria dinámica y su uso en C M. en C. Edgardo Adrián Franco Martínez http://www.eafranco.com edfrancom@ipn.mx @edfrancom edgardoadrianfrancom Estructuras de datos (Prof. Edgardo A. Franco) 1

Más detalles

Algoritmo, Estructuras y Programación II Ing. Marglorie Colina

Algoritmo, Estructuras y Programación II Ing. Marglorie Colina Unidad III Punteros Algoritmo, Estructuras y Programación II Ing. Marglorie Colina Ejemplo: Paso de Punteros a una Función Arreglos (Arrays) Unidimensionales Los Arreglos son una colección de variables

Más detalles

Introducción a la Programación en C Funciones

Introducción a la Programación en C Funciones Christopher Expósito-Izquierdo cexposit@ull.edu.es Airam Expósito-Márquez aexposim@ull.edu.es Israel López-Plata ilopezpl@ull.edu.es Belén Melián-Batista mbmelian@ull.edu.es José Marcos Moreno-Vega jmmoreno@ull.edu.es

Más detalles

Estructuras de control selectivas

Estructuras de control selectivas Práctica 3 Estructuras de control selectivas Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Versión 2.0.2 Concepto de sentencia y estructura de control El cuerpo de los métodos

Más detalles

Unidad Didáctica 3. Tipos genéricos. Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos

Unidad Didáctica 3. Tipos genéricos. Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Unidad Didáctica 3 Tipos genéricos Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Definición de tipo genérico Hablamos de un tipo genérico cuando el tipo en cuestión depende

Más detalles

BENEMERITA UNIVERSIDADD AUTONOMA DE PUEBLA FACULTAD DE CIENCIAS DE LA COMPUTACIÓN LICENCIATURA EN CIENCIAS DE LA COMPUTACIÓN

BENEMERITA UNIVERSIDADD AUTONOMA DE PUEBLA FACULTAD DE CIENCIAS DE LA COMPUTACIÓN LICENCIATURA EN CIENCIAS DE LA COMPUTACIÓN BENEMERITA UNIVERSIDADD AUTONOMA DE PUEBLA FACULTAD DE CIENCIAS DE LA COMPUTACIÓN LICENCIATURA EN CIENCIAS DE LA COMPUTACIÓN PROGRAMACION CONCURRENTE PARALELA Y PRACTICA 3 (PARTE 1 Y 2) HILOS POSIX NOMBRE:

Más detalles

Unidad IV. Este tipo de codificación nos es permitido gracias a la sobrecarga, la cual se aplica a métodos y constructores.

Unidad IV. Este tipo de codificación nos es permitido gracias a la sobrecarga, la cual se aplica a métodos y constructores. Unidad IV Métodos. 4.1 Definición de un método. El polimorfismo, en programación orientada a objetos, se refiere a la posibilidad de acceder a un variado rango de funciones distintas a través del mismo

Más detalles

Qué es Java? Un lenguaje de programación Un entorno de desarrollo Un entorno de aplicación Un entorno de despliegue Es similar en sintaxis de C + +.

Qué es Java? Un lenguaje de programación Un entorno de desarrollo Un entorno de aplicación Un entorno de despliegue Es similar en sintaxis de C + +. APUNTES DE JAVA Agenda Bienvenida Conociendo Java La Maquina Virtual Descargar e instalar el compilador El entorno de trabajo El paradigma de la programación orientada a objetos Qué es Java? Un lenguaje

Más detalles

JAVA NATIVE INTERFACE (JNI) INVOCANDO C/C++ DESDE JAVA

JAVA NATIVE INTERFACE (JNI) INVOCANDO C/C++ DESDE JAVA JAVA NATIVE INTERFACE (JNI) INVOCANDO C/C++ DESDE JAVA Java proporciona un marco denominado Java Native Interface (JNI), con la que es posible escribir métodos nativos. Un método nativo es un método que

Más detalles

IMPLEMENTACIÓN DE CONCEPTOS P.O.O. EN JAVA

IMPLEMENTACIÓN DE CONCEPTOS P.O.O. EN JAVA IMPLEMENTACIÓN DE CONCEPTOS P.O.O. EN JAVA Implementación de conceptos P.O.O. en Java Temario 2. Conceptos de Programación Orientada a Objetos 1. Conceptos de P.O.O. 2. Implementación de conceptos P.O.O

Más detalles

Tutorial de C# Delegados y Eventos. Por: Óscar López, M.Sc.

Tutorial de C# Delegados y Eventos. Por: Óscar López, M.Sc. Tutorial de C# Delegados y Eventos Por: Óscar López, M.Sc. olopez@uniandino.com.co DELEGADOS Delegados Son unos objetos que implícitamente extienden de System.Delegate y definen un tipo referencia soportado

Más detalles

FACULTAD DE ECONOMIA Y ADMINISTRACION DEPARTAMENTO DE CIENCIAS DE LA COMPUTACION CÁTEDRA PROGRAMACION GENERAL. Trabajo Práctico Nº 4

FACULTAD DE ECONOMIA Y ADMINISTRACION DEPARTAMENTO DE CIENCIAS DE LA COMPUTACION CÁTEDRA PROGRAMACION GENERAL. Trabajo Práctico Nº 4 Trabajo Práctico Nº 4 Ejercicios Teóricos 1. Indique si las siguientes afirmaciones son verdaderas o falsas a. La programación orientada a objetos hace uso de clases y envío de mensajes entre objetos..

Más detalles

VARIABLES, CONSTANTES Y EXPRESIONES ASIGNACIÓN. TIPOS ELEMENTALES. PRECEDENCIA DE LOS ESTRUCTURAS DE CONTROL. CONDICIONAL E

VARIABLES, CONSTANTES Y EXPRESIONES ASIGNACIÓN. TIPOS ELEMENTALES. PRECEDENCIA DE LOS ESTRUCTURAS DE CONTROL. CONDICIONAL E Java Java es un lenguaje de programación presentado en 1995 enfocado a: soportar los fundamentos de la programación orientada a objetos. generar código independiente de la arquitectura de la computadora

Más detalles

Principios de Computadoras II

Principios de Computadoras II Departamento de Ingeniería Electrónica y Computadoras Ing. Ricardo Coppo rcoppo@uns.edu.ar Qué es un Objeto? Un objeto es una instancia de una clase Las clases actuán como modelos que permiten la creación

Más detalles

Elementos de un programa en C

Elementos de un programa en C Elementos de un programa en C Un programa en C consta de uno o más archivos. Un archivo es traducido en diferentes fases. La primera fase es el preprocesado, que realiza la inclusión de archivos y la sustitución

Más detalles

Clase Práctica Administración de Memoria en C. Organización de Computadoras Depto. Cs. e Ing. de la Comp. Universidad Nacional del Sur

Clase Práctica Administración de Memoria en C. Organización de Computadoras Depto. Cs. e Ing. de la Comp. Universidad Nacional del Sur Clase Práctica Administración de Memoria en C Depto. Cs. e Ing. de la Comp. Universidad Nacional del Sur Copyright Copyrigth 2018 Ing. Federico Joaquín. Las presentes transparencias constituyen una guía

Más detalles

Lección 2: Creando una Aplicación en Java. 1. Estructura del archivo de una clase. 3. Definiendo clases fundamentos

Lección 2: Creando una Aplicación en Java. 1. Estructura del archivo de una clase. 3. Definiendo clases fundamentos Lección 2: Creando una Aplicación en Java 1. Estructura del archivo de una clase 2. Usando una clase 3. Definiendo clases fundamentos Objetivos Conocer: La forma en la cual está se está estructurado el

Más detalles

Todo programa en 'C' consta de una o más funciones, una de las cuales se llama main.

Todo programa en 'C' consta de una o más funciones, una de las cuales se llama main. LENGUAJE C CARACTERISTICAS DEL LENGUAJE 'C' El lenguaje 'C' se conoce como un lenguaje compilado. Existen dos tipos de lenguaje: interpretados y compilados. Los interpretados son aquellos que necesitan

Más detalles

Examen Teórico. Convocatoria de Febrero de 2018

Examen Teórico. Convocatoria de Febrero de 2018 Examen Teórico Convocatoria de Febrero de 2018 Nombre: DNI: Grupo: 1. Dado un proyecto Java en Eclipse que tiene como clase principal proyecto.programa y requiere de la librería matemática de Apache commons-math.jar,

Más detalles

Caracter a caracter los datos pueden ser escritos o leidos carácter a carácter, con las funciones fputc() y fgetc().

Caracter a caracter los datos pueden ser escritos o leidos carácter a carácter, con las funciones fputc() y fgetc(). Notas auxiliares sobre manejo de archivos Las funciones de entrada salida (E/S) de las librerías estandar de C, permiten leer y escribir datos a, y desde, archivos y dispositivos. La caracteristica fundamental

Más detalles

Qué ofrece Autentia Real Business Solutions S.L?

Qué ofrece Autentia Real Business Solutions S.L? Avenida de Castilla,1 - Edificio Best Point - Oficina 21B 28830 San Fernando de Henares (Madrid) tel./fax: +34 91 675 33 06 info@autentia.com - www.autentia.com Qué ofrece Autentia Real Business Solutions

Más detalles

Examen Teórico Convocatoria de Junio de 2012

Examen Teórico Convocatoria de Junio de 2012 Examen Teórico Convocatoria de Junio de 2012 Nombre: DNI: Titulación: 1. Sobre el control de errores en Java: a) El siguiente método contiene un error de compilación debido al uso de excepciones. Explica

Más detalles

Lenguaje C. República Bolivariana de Venezuela Fundación Misión Sucre Aldea Fray Pedro de Agreda Introducción a la Programación III

Lenguaje C. República Bolivariana de Venezuela Fundación Misión Sucre Aldea Fray Pedro de Agreda Introducción a la Programación III República Bolivariana de Venezuela Fundación Misión Sucre Aldea Fray Pedro de Agreda Introducción a la Programación III Lenguaje C 1 Puntos previos Los códigos fuentes generados en C requieren ser compilados

Más detalles

Introducción a C++ Índice

Introducción a C++ Índice Introducción a C++ 1. 2. 3. 4. 5. 6. Índice 1. Diferencias entre C y C++. 2. Diferencias entre C++ y Java. 3. Ejemplos. 4. Funciones. 5. Memoria dinámica 6. Librería de funciones. 1 1. Diferencias entre

Más detalles

Bloque II. Elementos del lenguaje de programación Java

Bloque II. Elementos del lenguaje de programación Java Bloque II. Elementos del lenguaje de programación Java 1.Introducción a los lenguajes de programación 2. Estructura de un programa 3. Datos y expresiones simples 4. Instrucciones de control 5. Entrada/salida

Más detalles

Tema 3: Entrada/Salida de Ficheros

Tema 3: Entrada/Salida de Ficheros Tema 3: Objetivo: Almacenar datos en un dispositivo de almacenamiento secundario (p.e. disco duro). Pasos a seguir: 1 Abrir fichero 2 Escribir/leer del fichero 3 Cerrar fichero 1 Tema 3: Abrir el fichero:

Más detalles

CAPITULO 6: FUNCIONES

CAPITULO 6: FUNCIONES CAPITULO 6: FUNCIONES 1. INTRODUCCIÓN Un problema de programación en C se resuelve descomponiéndolo en varias partes. Cada una de estas partes se puede asociar a una función que resuelva su fracción correspondiente

Más detalles

Tipos Recursivos de Datos

Tipos Recursivos de Datos 1/1 Tipos Recursivos de Datos Josefina Sierra Santibáñez 27 de noviembre de 2016 2/1 Introducción La recursividad no sólo se puede aplicar a la definición de procedimientos (i.e. funciones o acciones),

Más detalles

Ficheros. Archivo, o fichero: Características:

Ficheros. Archivo, o fichero: Características: Ficheros Archivo, o fichero: Es una estructura de datos en memoria externa, cuyo tiempo de vida no está ligado a la ejecución del programa que lo crea o lo maneja. Un fichero existe desde que un programa

Más detalles

Memoria Dinámica. Jornadas de Marzo 2010 Grupo de Usuarios de Linux Tania Pérez

Memoria Dinámica. Jornadas de Marzo 2010 Grupo de Usuarios de Linux Tania Pérez Jornadas de Marzo 2010 Grupo de Usuarios de Linux Tania Pérez 1. PUNTEROS 2. MEMORIA DINÁMICA 2 1. PUNTEROS 3 Qué es un puntero? Un tipo de variable cuyo valor es la dirección de memoria de otra variable.

Más detalles

Desde los programas más simples escritos en un lenguaje de programación suelen realizar tres tareas en forma secuencial.

Desde los programas más simples escritos en un lenguaje de programación suelen realizar tres tareas en forma secuencial. Tipos de Datos Desde los programas más simples escritos en un lenguaje de programación suelen realizar tres tareas en forma secuencial. Entrada de datos Procesamientos de datos Salida de resultados Los

Más detalles

Archivos. Programación en C 1

Archivos. Programación en C 1 Archivos Programación en C 1 Índice Tipos de archivos. Apertura de archivos. Cierre de archivos. Lectura de archivos. Escritura de archivos. Acceso directo en archivos binarios. Programación en C 2 Introducción

Más detalles

Repaso Lenguaje C Área de Servicios Programación (Ing. Elect. y Prof. Tec.), Programación I (TUG y TUR) y Electrónica programable (TUE)

Repaso Lenguaje C Área de Servicios Programación (Ing. Elect. y Prof. Tec.), Programación I (TUG y TUR) y Electrónica programable (TUE) Repaso Lenguaje C OBJETOS Variables Constantes Variable: objeto del ambiente cuyo contenido puede cambiar. Constante: objeto cuyo contenido no puede cambiar. Variables: - un nombre que la identifica. Deben

Más detalles

INTERACCION ENTRE OBJETOS

INTERACCION ENTRE OBJETOS INTERACCION ENTRE OBJETOS Corina Flores Villarroel UMSS - Contenido Este capítulo se discutirán conceptos relacionados con: Abstracción y encapsulamiento, Modularización, composición Creación de objetos,

Más detalles

Programación I Teoría III.

Programación I Teoría III. Programación I Teoría III http://proguno.unsl.edu.ar proguno@unsl.edu.ar DATOS ESTRUCTURADOS Estructuras de Datos Hasta ahora hemos trabajado con Datos simples enteros reales Caracteres punteros Sin embargo,

Más detalles

PROGRAMACIÓN EN LENGUAJE C VARIABLES Y CONSTANTES

PROGRAMACIÓN EN LENGUAJE C VARIABLES Y CONSTANTES VARIABLES Y CONSTANTES Variables: Es un espacio reservado en la memoria donde podemos almacenar un valor durante la ejecución de un programa, a dicho espacio se le asocia un nombre (identificador). El

Más detalles

Tema 6: Clases. Índice

Tema 6: Clases. Índice Tema 6: Clases Antonio J. Sierra Índice 1. Fundamentos. 2. Declaración de objetos. 3. Asignación de objetos a variables referencia. 4. Métodos. 5. Constructores. 6. this. 7. Recogida de basura. 8. Modelado

Más detalles

Examen Teórico (1/3 de la nota final)

Examen Teórico (1/3 de la nota final) Examen Teórico (1/3 de la nota final) 105000016 - Programación para Sistemas Grado en Ingeniería Informática (2009) Lenguajes y Sistemas Informáticos e Ingeniería de Software Facultad de Informática Universidad

Más detalles

Introducción a Java. Introducción a Java. Programación I

Introducción a Java. Introducción a Java. Programación I Introducción a Java Introducción a Java Programación I Como Funciona Tipos de Datos TIPO TAMAÑO RANGO byte 8 bits Valores numéricos de 128 a 127 short 16 bits Valores numéricos de 32.768 a 32.767 int 32

Más detalles

Tema 13: Apuntadores en C

Tema 13: Apuntadores en C Tema 13: Apuntadores en C M. en C. Edgardo Adrián Franco Martínez http://www.eafranco.com edfrancom@ipn.mx @edfrancom edgardoadrianfrancom Estructuras de datos (Prof. Edgardo A. Franco) 1 Contenido Introducción

Más detalles

Prueba N o 1. Programación II

Prueba N o 1. Programación II UNIVERSIDAD ANDRÉS BELLO 1 Prueba N o 1 Programación II Profesores: José Luis Allende y Carlos Beyzaga. Fecha: 10 de Septiembre de 2013 Nombre: Nota: Instrucciones: Coloque su nombre a todas las hojas.

Más detalles

PUNTEROS (APUNTADORES)

PUNTEROS (APUNTADORES) 2010 UNAN LEON Departamento de Computación Ing. En Sistemas Sabatino Autor: Ing: Karina Esquivel Alvarado. Asignatura: Algoritmo y Estructura de Datos. PUNTEROS (APUNTADORES) TEMA 4: PUNTEROS (APUNTADORES)

Más detalles

Programación orientada a objetos I

Programación orientada a objetos I Introducción Programación orientada a objetos I Curso INEM. Programación en C++ Santiago Muelas Pascual smuelas@fi.upm.es Qué es la POO? Un paradigma de programación Un paradigma es una forma de afrontar

Más detalles

Una expresión es una combinación de uno o más operandos y operadores para obtener un resultado.

Una expresión es una combinación de uno o más operandos y operadores para obtener un resultado. 1.6. EXPRESIONES CONCEPTO: Una expresión es una combinación de uno o más operandos y operadores para obtener un resultado. Los operandos pueden ser constantes, variables, otras expresiones e incluso funciones.

Más detalles

Programación Orientada a Objetos. Resumen de Temas Unidad 3: Constructores y destructores

Programación Orientada a Objetos. Resumen de Temas Unidad 3: Constructores y destructores Programación Orientada a Objetos Resumen de Temas Unidad 3: Constructores y destructores 3.1 Conceptos de métodos constructor y destructor Java inicializa siempre con valores por defecto las variables

Más detalles

Repaso 02: Apuntadores y manejo de memoria dinámica

Repaso 02: Apuntadores y manejo de memoria dinámica Repaso 02: Apuntadores y manejo de memoria dinámica Solicitado: Ejercicios 02: Programación con memoria dinámica M. en C. Edgardo Adrián Franco Martínez http://www.eafranco.com edfrancom@ipn.mx @edfrancom

Más detalles

El operador contenido ( ) permite acceder al contenido de

El operador contenido ( ) permite acceder al contenido de 3. Memoria Dinámica y Punteros Objetivos: Distinguir los conceptos de memoria estática y memoria dinámica Comprender el concepto de puntero como herramienta de programación Conocer cómo se definen y cómo

Más detalles

Tema 13: Manejo de archivos en lenguaje C

Tema 13: Manejo de archivos en lenguaje C Tema 13: Manejo de archivos en lenguaje C M. en C. Edgardo Adrián Franco Martínez http://www.eafranco.com edfrancom@ipn.mx @edfrancom edgardoadrianfrancom Estructuras de datos (Prof. Edgardo A. Franco)

Más detalles

Algoritmos y Estructuras de Datos Ingeniería en Informática, Curso 2º SEMINARIO DE C++ Sesión 1

Algoritmos y Estructuras de Datos Ingeniería en Informática, Curso 2º SEMINARIO DE C++ Sesión 1 Algoritmos y Estructuras de Datos Ingeniería en Informática, Curso 2º SEMINARIO DE C++ Sesión 1 Contenidos: 1. Características generales de C++ 2. Entrada/salida estándar 3. Variables y tipos de datos

Más detalles

! Qué es la POO?! Un paradigma de programación. ! No hay paradigmas mejores ni peores! Todos tienen sus ventajas e inconvenientes

! Qué es la POO?! Un paradigma de programación. ! No hay paradigmas mejores ni peores! Todos tienen sus ventajas e inconvenientes Introducción Programación orientada a objetos Curso INEM. Programación en Java Santiago Muelas Pascual smuelas@fi.upm.es! Qué es la POO?! Un paradigma de programación! Un paradigma es una forma de afrontar

Más detalles

Definición Es una directiva using que ayuda al compilador a localizar una clase que se usa en la aplicación.

Definición Es una directiva using que ayuda al compilador a localizar una clase que se usa en la aplicación. Capitulo 3 Introducción a las aplicaciones de C# Resumen: Item using System; espacios de nombres: Las palabras clave estilo de mayúsculas/minúsculas Pascal public class Bienvenido1 Definición Es una directiva

Más detalles

Ejercicio de Programación Orientada a Objetos Curso 2016/2017 Exámenes

Ejercicio de Programación Orientada a Objetos Curso 2016/2017 Exámenes Ejercicio de Programación Orientada a Objetos Curso 2016/2017 Exámenes Introducción El ejercicio consiste en la implementación de una aplicación para la creación, edición, resolución y corrección de exámenes.

Más detalles

Clases y Objetos en C++

Clases y Objetos en C++ Informática II Clases y Objetos en C++ Introducción Las variables de los tipos fundamentales de datos no son suficientes para modelar adecuadamente objetos del mundo real. alto, ancho y longitud para representar

Más detalles

18. Interfaces Declaración de una interfaz

18. Interfaces Declaración de una interfaz Programación orientada a objetos con Java 191 18. Interfaces Objetivos: a) Definir el concepto de interfaz b) Interpretar el código fuente de una aplicación Java donde aparecen interfaces c) Construir

Más detalles

2.2 Nombres, Ligado y Ámbito

2.2 Nombres, Ligado y Ámbito 2.2 Nombres, Ligado y Ámbito Ligado estático y dinámico, reglas de ámbito y prueba de tipos. Conceptos Nombres e Identificadores Variables Tipos Ámbito Constantes Nombres Identificador que designa en el

Más detalles

Memoria Dinámica en C++

Memoria Dinámica en C++ Memoria Dinámica en C++ Algoritmos y Estructuras de Datos II DC-FCEyN-UBA 26 de Agosto de 2015 AED2 (DC-FCEyN-UBA) Memoria Dinámica en C++ 26 de Agosto de 2015 1 / 46 Repaso: Qué es una variable? Matemática:

Más detalles

Tema 1. Introducción a JAVA

Tema 1. Introducción a JAVA Tema 1. Introducción a JAVA Historia Características Plataforma Java Entorno de desarrollo Ejemplo: Hola mundo Estructura general de un programa Java 1 Historia de Java (i) Surge en 1991: Sun Microsystems

Más detalles

REPASO ARRAYS O ARREGLOS UNIDIMENSIONALES EN JAVA. EJEMPLOS DE CÓDIGO. (CU00903C)

REPASO ARRAYS O ARREGLOS UNIDIMENSIONALES EN JAVA. EJEMPLOS DE CÓDIGO. (CU00903C) APRENDERAPROGRAMAR.COM REPASO ARRAYS O ARREGLOS UNIDIMENSIONALES EN JAVA. EJEMPLOS DE CÓDIGO. (CU00903C) Sección: Cursos Categoría: Lenguaje de programación Java nivel avanzado I Fecha revisión: 2039 Resumen:

Más detalles

Práctico 2: Funciones y Punteros en C La teoría general para este práctico puede consultarse en los Capítulos 4 y 5 Notas de Clase

Práctico 2: Funciones y Punteros en C La teoría general para este práctico puede consultarse en los Capítulos 4 y 5 Notas de Clase Práctico 2: Funciones y Punteros en C La teoría general para este práctico puede consultarse en los Capítulos 4 y 5 Notas de Clase 1. Ejecute el siguiente programa y diga que hace la función calcula: #include

Más detalles

Curso de Java Introducción a la Programación II

Curso de Java Introducción a la Programación II Curso de Java Introducción a la Programación II Jaime Fernández Martín Curso INEM 02830. Programación en Java Marzo 2010 Índice 1 Tipos Java 2 Decalaración de variables 3 Operadores aritméticos Índice

Más detalles

Tema 1. Herencia y Polimorfismo

Tema 1. Herencia y Polimorfismo ÍNDICE EDA. Unidad didáctica I: Conceptos de Java para Estructuras de Datos Tema 1. Herencia y Polimorfismo 1. Relaciones entre clases: Reutilización del software. 2. La Herencia como soporte Java del

Más detalles

Programación en C. Algoritmo y Estructura de Datos. Ing. M. Laura López. Programación en C

Programación en C. Algoritmo y Estructura de Datos. Ing. M. Laura López. Programación en C Algoritmo y Estructura de Datos Ing. M. Laura López 1 Estructura de un programa en C 2 Estructura de un programa en C #include Archivos de cabecera # define Definición de constantes Declaraciones Globales

Más detalles