Java Native Interface

Surgiu a necessidade de usar o JNI (Java Native Interface) e tive muita dificuldade para encontrar informações sobre o assunto. Então resolvi compartilhar o que aprendi sobre este assunto.

[ Hits: 22.169 ]

Por: Allan kardec Santos Oliveira em 22/09/2011


Exemplo de utilização do JNI



Para criar bibliotecas em código nativo será necessário instalar o JDK e o gcc. Seria bom também instalar o gcc-java caso queira usar o gcj para compilar o código Java.

Neste tópico vou mostrar um simples exemplo que utiliza o JNI.

Vamos criar um programa Java que vai declarar a função chamada getSoma, que receberá dois parâmetros e resultará a soma dos dois em forma de string.

Veja o código:

exemplo1.java: public class exemplo1{ //declaração da função que será implementada pelo código c++ public native String getSoma(int a, int b); static{ System.loadLibrary("exemplo1"); //carrega a biblioteca libexemplo1.so } public static void main(String args[]){ exemplo1 app = new exemplo1(); String retorno = app.getSoma(2,3); System.out.println("O resultado de 2+3 é "+retorno); } }

Para compilar:

javac exemplo1.java

Agora devemos gerar o arquivo exemplo1.h usando o aplicativo javah:

javah -jni exemplo1

Será gerado o arquivo de cabeçalho exemplo1.h com a declaração da função.

Veja o arquivo abaixo:

exemplo1.h:

/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class exemplo1 */ #ifndef _Included_exemplo1 #define _Included_exemplo1 #ifdef __cplusplus extern "C" { #endif /* * Class: exemplo1 * Method: getSoma * Signature: (II)Ljava/lang/String; */ //Abaixo está a declaração da função que vamos ter que implementar no arquivo exemplo1.cpp JNIEXPORT jstring JNICALL Java_exemplo1_getSoma(JNIEnv *, jobject, jint, jint); #ifdef __cplusplus } #endif #endif

Observe que o javah declarou a função com o padrão JNI. Os parâmetros int foram substituídos por jint e String substituído por jstring.

Agora devemos criar o arquivo exemplo1.cpp implementando esta função.

Vamos lá:

exemplo1.cpp:

#include "exemplo1.h" #include <iostream> #include <sstream> using std::string; using std::ostringstream; string intToStr(int numero); //função para facilitar a manipulação das informações /*observe que acrescentei as variáveis env, a, b na implementação da função. O ponteiro "env" contém funções úteis para conversão entre tipos nativos e tipos primitivos da linguagem C/C++. As variáveis a e b serão usadas na função */ JNIEXPORT jstring JNICALL Java_exemplo1_getSoma(JNIEnv *env, jobject, jint a, jint b){ jstring resultado; //criando a variável retorno string sresultado; //criando a variável string para facilitar o desenvolvimento. sresultado = intToStr(a+b); //A função env->NewStringUTF recebe um char* e retorna um jstring. //Já sresultado.c_str() retorna um char* que será convertido em jstring. resultado = env->NewStringUTF(sresultado.c_str()); return resultado; //retorno para o java. } //função criada para converter um int em string. string intToStr(int numero){ std::ostringstream svalor; svalor << numero; return svalor.str(); }

Agora basta compilar o arquivo exemplo1.cpp:

g++ -fPIC -shared -o libexemplo1.so exemplo1.cpp

Este comando vai gerar o arquivo libexemplo1.so. Copie este arquivo para a pasta /usr/lib64 ou /usr/lib dependendo da sua distribuição Linux.

Para testar basta executar o programa exemplo1.class.

java exemplo1

Você deve obter o resultado:

O resultado de 2+3 é 5.


Página anterior     Próxima página

Páginas do artigo
   1. O que é o JNI
   2. Funcionamento
   3. Exemplo de utilização do JNI
   4. Um exemplo mais complexo
Outros artigos deste autor

Construindo uma aplicação JDialog

Criando classe Java para conectar e manipular dados no MySQL

Emulando o Internet Explorer no Slackware

Leitura recomendada

Configurando e-Gen + Tomcat + JSDK

Preparando ambiente de desenvolvimento Android no Debian/Ubuntu

Desenvolvendo aplicações Web 2.0 com Java e AJAX (FrameWork DWR)

Busca corporativa com Apache Solr - Motivação e conceitos

Linux com Java 1.7 + JBoss 7

  
Comentários
[1] Comentário enviado por asdf2 em 23/09/2011 - 00:42h

artigo bom mas esqueceu de por um simples hello world pra comparação de codigo, mas valeu, nota 8

[2] Comentário enviado por elyssonmr em 23/09/2011 - 10:31h

Muito legal isso, só não entendi uma coisa: você utiliza o Header da lib parted e depois gera o .so compatível com o jni certo?

Se já possuir um .so pronto como eu faria para linkar com o java, porque neste caso o a lib a ser utilizada esta sendo compilada?

Vlw

[3] Comentário enviado por super-root em 23/09/2011 - 17:58h

Elyssonmr, caso você tenha uma lib no padrão do JNI, então será necessário conhecer as funções/declarações desta biblioteca. Desta forma seria necessário criar somente o programa em java com lendo as funções da biblioteca.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts