introdução à programação orientada a objetos com java

19
Introdução à Programação Orientada a Objetos com Java Adeline de Sousa Silva Centro de Informática Universidade Federal de Pernambuco Java Native Interface JNI

Upload: brice

Post on 22-Jan-2016

32 views

Category:

Documents


0 download

DESCRIPTION

Introdução à Programação Orientada a Objetos com Java. Java Native Interface JNI. Adeline de Sousa Silva Centro de Informática Universidade Federal de Pernambuco. O que é JNI ?. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Introdução à Programação Orientada a Objetos com Java

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

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

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

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

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

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

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

#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

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

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

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

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

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

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

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

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

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

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

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)