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.
Parte 4: Um exemplo mais complexo
Como havia dito anteriormente, o que me motivou a utilizar o JNI foi criar uma forma de utilizar funções da biblioteca libparted.so no Java. Este exemplo vai mostrar a solução encontrada para esta situação.
Vamos criar o arquivo jparted.java com uma função getParticoes que receberá uma string contendo o dispositivo(hd) e devolverá um array de string contento informação das partições encontradas no hd.
Para este exemplo é necessário ter o parted instalado em sua distribuição(ftp://ftp.gnu.org/gnu/parted/parted-3.0.tar.gz).
A ideia é implementar uma função nativa escrita em C++ que por sua vez vai lê as partições do hd usando as funções que estão implementadas na biblioteca libparted.so.
Vamos para o código:
jparted.java:
Compilando...
javac jparted.java
Gerando o arquivo de cabeçalho em C/C++:
javah -jni jparted
Arquivo jparted.h gerado pelo javah:
jparted.h:
Vamos criar a implementação do arquivo da função java_jparted_get_1partition no arquivo jparted.cpp:
Para compilar este arquivo é necessário inserir nos argumentos de compilação a opção -lparted. Esta opção indica ao compilador que a biblioteca libparted.so deverá ser compilada junto com o arquivo jparted.cpp.
g++ -fPIC -shared -o libjparted.so jparted.cpp -lparted
Copie o arquivo libjparted.so para a pasta /usr/lib64 ou /usr/lib dependendo do tipo de sistema operacional 32/64bits.
Para testar sua aplicação java, certifique que tenha informado o dispositivo correto no arquivo jparted.java. No meu caso usei /dev/sda. Certifique também que tem acesso a leitura deste dispositivo.
# chmod +r /dev/<dispositivo>
Vamos testar o arquivo jparted.class:
java jparted
Se tudo estiver correto você deve obter um resultado semelhante a este:
Espero que este artigo ajude a comunidade caso necessitem usar o JNI ou pelo menos direcione para encontrar mais informações.
Para verificar todo o poder deste recurso, recomendo que leiam:
Vamos criar o arquivo jparted.java com uma função getParticoes que receberá uma string contendo o dispositivo(hd) e devolverá um array de string contento informação das partições encontradas no hd.
Para este exemplo é necessário ter o parted instalado em sua distribuição(ftp://ftp.gnu.org/gnu/parted/parted-3.0.tar.gz).
A ideia é implementar uma função nativa escrita em C++ que por sua vez vai lê as partições do hd usando as funções que estão implementadas na biblioteca libparted.so.
Vamos para o código:
jparted.java:
Compilando...
javac jparted.java
Gerando o arquivo de cabeçalho em C/C++:
javah -jni jparted
Arquivo jparted.h gerado pelo javah:
jparted.h:
Vamos criar a implementação do arquivo da função java_jparted_get_1partition no arquivo jparted.cpp:
Para compilar este arquivo é necessário inserir nos argumentos de compilação a opção -lparted. Esta opção indica ao compilador que a biblioteca libparted.so deverá ser compilada junto com o arquivo jparted.cpp.
g++ -fPIC -shared -o libjparted.so jparted.cpp -lparted
Copie o arquivo libjparted.so para a pasta /usr/lib64 ou /usr/lib dependendo do tipo de sistema operacional 32/64bits.
Para testar sua aplicação java, certifique que tenha informado o dispositivo correto no arquivo jparted.java. No meu caso usei /dev/sda. Certifique também que tem acesso a leitura deste dispositivo.
# chmod +r /dev/<dispositivo>
Vamos testar o arquivo jparted.class:
java jparted
Se tudo estiver correto você deve obter um resultado semelhante a este:
Warning: Unable to open /dev/sda read-write (Permission denied). /dev/sda has been opened read-only.
Warning: Unable to open /dev/sda read-write (Permission denied). /dev/sda has been opened read-only.
/dev/sda1 ntfs
/dev/sda5 fat32
/dev/sda6 reiserfs
/dev/sda7 reiserfs
/dev/sda8 reiserfs
/dev/sda9 reiserfs
/dev/sda10 linux-swap(v1)
Conclusão
O recurso JNI é muito poderoso e pode ser usado quando a linguagem java tiver alguma limitação para executar alguma tarefa. Este artigo mostra somente uma pequena porção do que o JNI é capaz de fazer.Espero que este artigo ajude a comunidade caso necessitem usar o JNI ou pelo menos direcione para encontrar mais informações.
Para verificar todo o poder deste recurso, recomendo que leiam:
- http://java.sun.com/docs/books/jni/html/jniTOC.html
- Chapter 5: JNI Technology
- Livro: Universidade Java