Bibliotecas .so .dll
Materiais
Para fazer chamadas à bibliotecas nativas do sistema operacional vamos precisar
da biblioteca JNA (Java Native Access). Para isso faça o download direto na fonte:
https://github.com/twall/jna/raw/master/dist/jna.jar
Você também vai precisar de uma biblioteca nativa para fazer os testes. Se você não tiver uma e/ou quiser criar a própria, veja no final do artigo como.
Vou partir do presuposto de que você já tem o Java instalado e devidamente configurado e, incialmente, de que você faça uso de alguma IDE para facilitar.
Downloads dos fontes e compilados no final da página
Direto ao ponto
Classe Java
import com.sun.jna.Library; import com.sun.jna.Native; public class RodarComJNA { public interface BibliotecaNativa extends Library{ public int soma(int n1, int n2); } public static void main(String[] args) { BibliotecaNativa lib = (BibliotecaNativa) Native.loadLibrary("calc", BibliotecaNativa.class); int resultado = lib.soma(10, 15); System.out.println("Mostrando o resultado retornado pela biblioteca direto no Java: " + resultado); } }
- Para cada função da biblioteca (com seus parâmetros e retornos) deve haver uma assinatura idêntica na iterface BibliotecaNativa (que poderia se chamar "XuxuComBanana").
- Deve haver os dois imports do JNA sempre.
-
Se você estiver usando Windows, a
.dll
deve estar no mesmo diretório que a classe ou em C:\Windows\System32 (se não me engano). -
Se você estiver usando Linux, a
.so
deve estar obrigatoriamente em/usr/lib
e se chamarlibcalc.so
e permanecer comocalc
na classe Java. - Nunca coloque a extensão da biblioteca na chamada do Java.
Criando a sua biblioteca escrita em C (no Linux)
Você precisará do GCC (GNU Compiler Collection) para compilar o código. Muito
provavelmente seu Linux já tenha "de fábrica". Vamos criar uma Shared
Library (bibliteca compartilhada)
Header da biblioteca
Crie um arquivo com a extensão .h
da sua biblioteca contendo todas as assinaturas
das funções que você desejar criar. No exemplo utilizado o arquivo se chama calc.h
#include <stdio.h> #include <stdlib.h> int soma(int n1, int n2);
Crie o arquivo principal da sua biblioteca, o .c
.
#include <stdio.h> #include <tdlib.h> #include "calc.h" int soma(int n1, int n2){ printf("Print dentro da biblioteca:%i\n", n1+n2); return n1+n2; }
Agora vamos compilar a nossa biblioteca e gerar um arquivo objeto. Em seguida fazer o link com as bibliotecas do sistema. Os comandos são esses, incluse na ordem:
gcc -c -fPIC calc.c -o calc.o
gcc -shared -o libcalc.so calc.o
Agora você vai precisar copiar a biblioteca para o diretório padrão no GNU/Linux:
sudo sp libcalc.so /usr/lib
Criando um JAR com o JNA embutido
Vamos agora criar na unha um JAR com as classes do JNA embutido. Se você usa IDE (tomara) esqueça isso pois a ferramenta fará isso por você. Se for um "hardcore", siga os passos abaixo.
Descompacte a biblioteca JNA que você baixo:
unzip jna.jar
Você deve ter percebido que apareceu uma pasta chamada META-INF
e outra chamada
com
. Vamos agora criar uma pasta chamada bibliotecas
e copiar a com
para dentro.
mkdir bibliotecas
cp com -r bibliotecas
Agora é necessário compilar a classe Java que foi apresentada logo no início do artigo. Durante a compilação vamos indicar qual é o classpath, ou seja, onde está as nossas bibliotecas.
javac RodarComJNA.java -cp bibliotecas
Antes de criar o JAR você precisará criar um arquivo contendo as informações para o manifesto do pacote. Crie um arquivo com qualquer nome (utilizei 'manifesto.txt') contendo o seguinte conteúdo:
Manifest-Version: 1.0
Created-By: 1.6.0_37 (Sun Microsystems Inc.)
Main-Class: RodarComJNA
Agora vamos de fato criar o JAR, colocando dentro do pacote o manifesto, as classes e a pasta principal dos fontes do JNA.
jar cfm RodarComJNA.jar manifesto.txt *.class com
Pronto! Já é para aparecer um arquivo chamado RodarComJNA.jar
.
Para executar o seu JAR basta chamar via linha de comando da seguinte forma:
java -jar RodarComJNA.jar
Qualquer dúvida, deixe seu comentário logo abaixo. Se deu certo ou errado, deixe também ^^
Download (fontes e compilados)Comentarios (2) para Usando Java para chamar .so e .dll
Obrigado, foi muito útil esse post!
Me ajudou no trabalho!
Seria legal também informar que se a dll for 32 bits é necessário usar uma jvm de 32 bits!
Gostaria de importar uma DLL em processing, mas não consigo seguindo este tutorial, é possível importa-la neste programa? Como faria?
Gostou do artigo? Acha que poderia ser melhor em algum ponto? Dê o seu feedback!