Aguarde...

Usando Java para chamar .so e .dll

Publicado em 27/08/2013

Bibliotecas .so .dll

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 chamar libcalc.so e permanecer como calc 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

Fabio da Silva Santana,   28/11/2014

estruturado.wordpress.com

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!

Luiz Léo,   17/08/2016

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!