190 likes | 343 Views
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 ?.
E N D
Introdução à ProgramaçãoOrientada a Objetos com Java Java Native Interface JNI Adeline de Sousa Silva Centro de Informática Universidade Federal de Pernambuco
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 decó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 • Escrever o arquivo java, contendo a assinatura de um método nativo • Compilar o programa java, usando o javac • Gerar o arquivo de cabeçalho com o aplicativo javah • 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(); } A classe em Java só possui a assinatura do método nativo Modificador “native” indica que o método é nativo
Compilando o programa Java e gerando o arquivo de cabeçalho Agora, basta compilar o programa: javac HelloNative.java E gerar o arquivo de cabeçalho: javah HelloNative
O arquivo de cabeçalho #include <jni.h> #ifndef _Included_HelloNative #define _Included_HelloNative #ifdef __cplusplus extern "C" { #endif JNIEXPORT void JNICALL Java_HelloNative_sayHello (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif 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 Directories e adicionar os paths do jdk1.2.2\include e jdk1.2.2\include\win32 • No menu Build, escolher Build DLL • São gerados vários arquivos, mas você só precisa importar a DLL.
Reescrevendo o programa Java public 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.
boolean byte char short int long float double jboolean jbyte jchar jshort jint jlong jfloat jdouble Tipos Java X Tipos C Java C
boolean[] int [] double[] Object[] jbooleanArray jintArray jdoubleArray jobjectArray Tipos Java X Tipos C (cont.)
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)