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 ?
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 ?
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)
entao, cara, preciso usar a DLL feita em C, mas nao tenho como recompilar a DLL para adcionar o Header gerado pelo javah
Alguem teria uma dica ?
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.
Vini, entao quer dizer, que depois que eu fizer a interface em java nao vou precisar usar o javah ?
O javah vai gerar os cabeçalhos de função que essa interface precisa.
mas nesse caso eu vou precisar gerar os headers ?
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?
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.
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 ?
Puts, agora que eu vi… esse exemplo que estava vendo eh com jna…
Sim, a interface JNI que eu falei é outra lib. Uma lib que acessa a DLL.
Entendi… valeu…
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 ?