Introdução à Programação Orientada a Objetos com Java
description
Transcript of Introdução à Programação Orientada a Objetos com Java
![Page 1: Introdução à Programação Orientada a Objetos com Java](https://reader036.fdocumentos.tips/reader036/viewer/2022082821/568150cc550346895dbef07e/html5/thumbnails/1.jpg)
Introdução à ProgramaçãoOrientada a Objetos com Java
Adeline de Sousa SilvaCentro de Informática
Universidade Federal de Pernambuco
Java Native InterfaceJNI
![Page 2: Introdução à Programação Orientada a Objetos com Java](https://reader036.fdocumentos.tips/reader036/viewer/2022082821/568150cc550346895dbef07e/html5/thumbnails/2.jpg)
O que é JNI ?
É uma interface que permite executar código nativo (dependente da
máquina local) escrito em outra linguagem dentro da
sua JVM.
O objetivo desta aula é mostrar os passos básicos para
executar um método nativo
![Page 3: Introdução à Programação Orientada a Objetos com Java](https://reader036.fdocumentos.tips/reader036/viewer/2022082821/568150cc550346895dbef07e/html5/thumbnails/3.jpg)
Quando usar métodos nativos?
• Quando já existe uma grande quantidade de código extensivamente testado e depurado escrito em outra linguagem e levaria tempo para portá-lo para Java, depurá-lo e testá-lo.
• Quando a aplicação requer acesso a recursos da máquina
• Quando a performance é parte crucial da aplicação
![Page 4: Introdução à Programação Orientada a Objetos com Java](https://reader036.fdocumentos.tips/reader036/viewer/2022082821/568150cc550346895dbef07e/html5/thumbnails/4.jpg)
Passos para escrever um método nativo
1. Escrever o arquivo java, contendo a assinatura de um método nativo
2. Compilar o programa java, usando o javac
3. Gerar o arquivo de cabeçalho com o aplicativo javah
4. Alterar o arquivo de cabeçalho, para dar nome aos parâmetros do método
![Page 5: Introdução à Programação Orientada a Objetos com Java](https://reader036.fdocumentos.tips/reader036/viewer/2022082821/568150cc550346895dbef07e/html5/thumbnails/5.jpg)
Passos para escrever um método nativo (cont.)
5. Escrever o arquivo C, que implementa o método definido no arquivo de cabeçalho
6. Compilar o arquivo C e gerar uma biblioteca (Unix, Linux) ou uma DLL(Windows)
7. Alterar o programa Java, para que ele possa carregar a biblioteca gerada no passo anterior
8. Recompilar o programa Java
![Page 6: Introdução à Programação Orientada a Objetos com Java](https://reader036.fdocumentos.tips/reader036/viewer/2022082821/568150cc550346895dbef07e/html5/thumbnails/6.jpg)
Declarando o método nativo
public class HelloNative { ... public native void sayHello();}
Modificador “native” indica que o método é
nativo
A classe em Java só possui a assinatura do método
nativo
![Page 7: Introdução à Programação Orientada a Objetos com Java](https://reader036.fdocumentos.tips/reader036/viewer/2022082821/568150cc550346895dbef07e/html5/thumbnails/7.jpg)
Compilando o programa Java e gerando o arquivo de cabeçalhoAgora, basta compilar o programa:
javac HelloNative.java
E gerar o arquivo de cabeçalho:
javah HelloNative
![Page 8: Introdução à Programação Orientada a Objetos com Java](https://reader036.fdocumentos.tips/reader036/viewer/2022082821/568150cc550346895dbef07e/html5/thumbnails/8.jpg)
#include <jni.h>#ifndef _Included_HelloNative#define _Included_HelloNative#ifdef __cplusplusextern "C" {#endifJNIEXPORT void JNICALL Java_HelloNative_sayHello (JNIEnv *, jobject);#ifdef __cplusplus}#endif#endif
O arquivo de cabeçalho
Falta dar nome aos parâmetros
![Page 9: Introdução à Programação Orientada a Objetos com Java](https://reader036.fdocumentos.tips/reader036/viewer/2022082821/568150cc550346895dbef07e/html5/thumbnails/9.jpg)
O arquivo em C
#include <stdio.h>#include "HelloNative.h"
JNIEXPORT void JNICALL Java_HelloNative_sayHello
(JNIEnv *env, jobject obj) { printf("\nHelloWorld!!!\n");
}
Código que será executado, quando o método java for chamado..
![Page 10: Introdução à Programação Orientada a Objetos com Java](https://reader036.fdocumentos.tips/reader036/viewer/2022082821/568150cc550346895dbef07e/html5/thumbnails/10.jpg)
Compilando o arquivo no Unix
gcc –G –I/usr/local/java/jdk1.2.2/include \
-I/usr/local/java/jdk1.2.2/include/solaris \ HelloNative.c –o hello.lib
![Page 11: Introdução à Programação Orientada a Objetos com Java](https://reader036.fdocumentos.tips/reader036/viewer/2022082821/568150cc550346895dbef07e/html5/thumbnails/11.jpg)
Compilando o arquivo no Windows (MS Visual C++)
•No menu File, escolha new
•Na Wizard New, escolha DLL
•Na Wizard DLL, escolha Empty DLL
•No menu project, escolher Add to Project, depois Files
•Inserir os arquivos .c e .h
![Page 12: Introdução à Programação Orientada a Objetos com Java](https://reader036.fdocumentos.tips/reader036/viewer/2022082821/568150cc550346895dbef07e/html5/thumbnails/12.jpg)
Compilando o arquivo no Windows (MS Visual C++)
• No menu Tools, escolher Options, depois No menu Tools, escolher Options, depois Directories e adicionar os paths do jdk1.2.2\Directories e adicionar os paths do jdk1.2.2\include e jdk1.2.2\include\win32include e jdk1.2.2\include\win32
• No menu Build, escolher Build DLLNo menu Build, escolher Build DLL
• São gerados vários arquivos, mas você só São gerados vários arquivos, mas você só precisa importar a DLL.precisa importar a DLL.
![Page 13: Introdução à Programação Orientada a Objetos com Java](https://reader036.fdocumentos.tips/reader036/viewer/2022082821/568150cc550346895dbef07e/html5/thumbnails/13.jpg)
Reescrevendo o programa Javapublic class HelloNative {
public native void sayHello();
static { System.load(“/home/adss/Hello.lib”); }}
Bloco estático. É executado antes do primeiro uso da classe
![Page 14: Introdução à Programação Orientada a Objetos com Java](https://reader036.fdocumentos.tips/reader036/viewer/2022082821/568150cc550346895dbef07e/html5/thumbnails/14.jpg)
Tipos
É preciso fazer conversões de tipos entre a linguagem Java e a linguagem C. Principalmente porque Java tem um sistema de tipos forte e o tamanho em bytes dos tipos para Java independe de plataforma, enquanto que em C isso não é verdade.
![Page 15: Introdução à Programação Orientada a Objetos com Java](https://reader036.fdocumentos.tips/reader036/viewer/2022082821/568150cc550346895dbef07e/html5/thumbnails/15.jpg)
Tipos Java X Tipos C
boolean byte char short int long float double
jboolean jbyte jchar jshort jint jlong jfloat jdouble
Java C
![Page 16: Introdução à Programação Orientada a Objetos com Java](https://reader036.fdocumentos.tips/reader036/viewer/2022082821/568150cc550346895dbef07e/html5/thumbnails/16.jpg)
Tipos Java X Tipos C (cont.) boolean[] int [] double[] Object[]
jbooleanArray jintArray jdoubleArray jobjectArray
![Page 17: Introdução à Programação Orientada a Objetos com Java](https://reader036.fdocumentos.tips/reader036/viewer/2022082821/568150cc550346895dbef07e/html5/thumbnails/17.jpg)
Tipos
Matrizes• São tratados como jobjectArray, onde
cada jobject é um jxxxArray Strings
• Precisam ser tratadas de forma especial pois Strings em Java são bem diferentes de Strings em C
![Page 18: Introdução à Programação Orientada a Objetos com Java](https://reader036.fdocumentos.tips/reader036/viewer/2022082821/568150cc550346895dbef07e/html5/thumbnails/18.jpg)
Algumas funções JNI
Toda função JNI é invocada através do ponteiro env, que é passado sempre como primeiro argumento em um método nativo e é um ponteiro para várias funções.
Toda função invocada, tem como primeiro argumento o ponteiro env.• Ex: (*env) -> GetObjectClass(env,obj);
![Page 19: Introdução à Programação Orientada a Objetos com Java](https://reader036.fdocumentos.tips/reader036/viewer/2022082821/568150cc550346895dbef07e/html5/thumbnails/19.jpg)
Algumas funções JNI
Funções que permitem acessar informações a respeito da classe:• getObjectClass(env, ref_obj)• getFieldID(env,ref_classe,nome_attr,
tipo_attr) • getXXXField(env, ref_obj,field_ID)• getMethodID(env, ref_classe,nome_met, assinatura)