segunda-feira, 30 de setembro de 2013

Métodos Nativos

Native Methods

Utilizando Métodos Nativos (Native Methods) em Java.

Métodos nos quais já foram implementados em C ou C++ e utilizados em aplicativos da mesma linguagem podem ser reutilizados nos aplicativos Java através de Métodos Nativos.

Usando a palavra chave "native" em um método de uma classe ela altera o compilado no qual o método será definido externamente, os métodos nativos como não tendo a implementação suas declarações são similares a métodos abstratos.

Ex:
class  OlaMundo{
    public native void ola();
}


Primeiramente essa classe deve ser compilado normalmente “javac OlaMundo.java” após deve ser utilizado a classe utilitária "javah" para criar um arquivo de leitura C da classe OlaMundo "javah OlaMundo" que pode ser achada no diretório jdk/bin.

Ex:
#include <jni.h="">
#ifndef  _Included_OlaMundo
#define _Included_OlaMundo

Extern “C” {

    /*
    *Class: OlaMundo
    *Method: ola
    *Sognature: ()V
    */

    JNIEXPORT void JNICALL Java_OlaMundo_ola (JNIRev *, jclass);

    #ifdef __cplusplus 
}

#endif
#endif


Dentro do arquivo esta a declaração da função Java_OlaMundo_ola, o JNIEXPORT e JNICALL são necessários para a utilização da biblioteca dinâmica.

A seguir a classe C deve ser implementada dessa forma, copiando a leitura do arquivo.

Ex:
#include "OlaMundo.h"
#include <stdio.h="">

JNIEXPORT void JNICALL Java_OlaMundo_ola (JNIRev * env, jclass cl);
{
    Print("Ola Mundo em JAVA utilizando o print de C!/n");
}


Deve-se carregar o biblioteca dinâmica porem a linha de comando muda dependendo do SO.

Ex:

Linux compilador Gnu:
-gcc -fPIC -I jdk/include/linux -shered -o libOlaMundo.so OlaMundo.c

Windows compilador Microsoft:
cl -I jdk\include -I jdk\include\win32 –LD OlaMundo.c –FeOlaMundo.dll


Por último deve ser chamado um método System.loadLibrary() para assegurar que a biblioteca será carregada antes do primeiro uso da classe.

Ex:
class TesteOlaMundo{
    public static void main (String[] args){
     OlaMundo.ola();
    }

    Static{
        System.loadLabrary("OlaMundo");
    }
} 


Referencia: Livro Core Java Volume II – Advanced Features do autor Gary Cornell

Nenhum comentário:

Postar um comentário