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

Post on 22-Jan-2016

32 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

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

Introdução à ProgramaçãoOrientada a Objetos com Java

Adeline de Sousa SilvaCentro de Informática

Universidade Federal de Pernambuco

Java Native InterfaceJNI

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

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

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

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

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

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

#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

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..

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

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

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.

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

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.

Tipos Java X Tipos C

boolean byte char short int long float double

jboolean jbyte jchar jshort jint jlong jfloat jdouble

Java C

Tipos Java X Tipos C (cont.) boolean[] int [] double[] Object[]

jbooleanArray jintArray jdoubleArray jobjectArray

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

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);

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)

top related