Duvida JNI e JNA

14 respostas
douglasmorais

Ola amigos…

Toda vez que eu precisar acessar uma DLL em C pelo java necessariamente eu terei que recompilar a DLL com o header gerado pelo javah ? Como eu faco se eu nao tiver o codigo fonte da DLL para compilar ?

14 Respostas

ByIvo

Vc se refere à APIs?
Eu nunca trabalhei com C, porém em java, tem a possibilidade de você adicionar Bibliotecas, basta clicar com o botão direito sobre a pasta de bibliotecas, adicionar jar/pasta ( isso no netbeans)

douglasmorais

entao, cara, preciso usar a DLL feita em C, mas nao tenho como recompilar a DLL para adcionar o Header gerado pelo javah

douglasmorais

Alguem teria uma dica ?

ViniGodoy

Não é isso. Você deve fazer uma interface JNI para sua dll. Ou seja, você deve criar uma série de funções de acesso, num formato que o Java aceita.
Essas funções são escritas também em C ou em C++, num projeto que use a dll em questão, não é necessário recompila-la.

Não importa se você a escreveu ou não, mas você tem que ser capaz de usa-la.

By the way, esse assunto está longe de ser Java Básico. Estou movendo o tópico para Java Avançado.

douglasmorais

Vini, entao quer dizer, que depois que eu fizer a interface em java nao vou precisar usar o javah ?

ViniGodoy

O javah vai gerar os cabeçalhos de função que essa interface precisa.

douglasmorais

mas nesse caso eu vou precisar gerar os headers ?

J

douglasmorais:
mas nesse caso eu vou precisar gerar os headers ?
O compilador já vai gerar os headers para você. Eu entendi sua dúvida. O que acontece é que você vai criar uma outra dll para acessar essa que você já tem. Então essa outra terá os cabeçalhos e será aque você usará na jvm. Entendeu?

douglasmorais

Eh que eu estou me baseando nesse exemplo:

import com.sun.jna.win32.StdCallLibrary;

public interface IKernel32 extends StdCallLibrary {   
void GetSystemTime(DataHoraSistema result);
}
import com.sun.jna.Native;
public class Kernel32JNA {   
public static void main(String args[]) {      
IKernel32 lib =          (IKernel32) Native.loadLibrary("kernel32", IKernel32.class);     
 DataHoraSistema time = new DataHoraSistema();      
 lib.GetSystemTime(time);      
 System.out.println("Data: " + time.wDay + "/" + time.wMonth +  "/" + time.wYear);   
   System.out.println("Hora: " + time.wHour +  ":" + time.wMinute);   
   }
}

E nesse caso nao foi usado o javah.

douglasmorais

Valeu Julio…

entao quer dizer que eu vou ter que criar outra lib em C ? E sera esta que eu carregarei no java e nao a DLL original ?

douglasmorais

Puts, agora que eu vi… esse exemplo que estava vendo eh com jna…

ViniGodoy

Sim, a interface JNI que eu falei é outra lib. Uma lib que acessa a DLL.

douglasmorais

Entendi… valeu…

J

douglasmorais:
Valeu Julio…

entao quer dizer que eu vou ter que criar outra lib em C ? E sera esta que eu carregarei no java e nao a DLL original ?


Sim. A pesar da jna ser um alternativa simples, jni é um método para estender a própria jvm. Aconselho você a utilizar jni apesar de ser mais trabalhoso por razões de qualidade de software.

Criado 10 de fevereiro de 2012
Ultima resposta 13 de fev. de 2012
Respostas 14
Participantes 4