JNI e integração com banco de dados

O contexto é um sistema que provê informações a partir de consultas a base de dados de diversas fontes. Minha atividade estava relacionada com a consulta a um banco de dados que seria integrada ao sistema, acessível a partir de uma função disponível em uma DLL (Dinamically Link Library - Biblioteca de Vínculo Dinâmico, para Windows).

Uma DLL pode ser vista como um pedaço de um código executável, disponível em tempo de execução. Assim, programas feitos em diversas linguagens podem acessar funções de uma DLL, desde que sejam feitos os mapeamentos corretos para os tipos dos argumentos da função e o valor de retorno.

O objetivo era invocar a partir de código Java a função de consulta disponibilizada na biblioteca em questão, usando JNI (veja). A implementação nativa de um método Java carregaria na memória a DLL, invocaria a função da biblioteca e repassaria uma string com o resultado da consulta, tarefa simples à primeira vista. Entretanto, o desafio foi descobrir como invocar corretamente a função da DLL. De início, a única dica fornecida foi o nome da função e o número de argumentos. Após alguns dias de tentativas mal sucedidas, recebi um exemplo de uso da função em Visual Basic. A conclusão da tarefa ocorreu após processos de tentativa e erro e de pesquisa sobre o mapeamento dos argumentos.

Aparentemente, fui a primeira pessoa na empresa a encarar um problema dessa natureza, e por isso, tive que investigar sozinho, tendo como única ajuda o meu chefe, que deu algumas sugestões. Quanto a ferramentas para desenvolvimento, utlizei Eclipse [14] para a parte Java e MinGW [25] para produzir a implementação nativa em C.

Como desconhecia essa tecnologia antes do início do projeto, realizei a leitura de alguns capítulos de [1] para compreender os principais conceitos. Quanto aos prazos, certamente havia uma data limite para a conclusão da tarefa, já que a aplicação envolvia clientes, mas não fui informado a respeito. Provavelmente, meu chefe teria falado de prazos se eu tivesse consumido muito tempo sem concluir a tarefa.