introdução à programação orientada a objetos com java
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 PresentationTRANSCRIPT
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)