Acessar um .dll usando JNI  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
fabriciocarraro
Entusiasta Java

Membro desde: 28/04/2008 12:58:44
Mensagens: 17
Offline

Fala pessoal,
Li bastante coisa aqui no fórum e na internet, mas não to entendendo aonde está dando errado.

Eu preciso criar um programa em Java que carregue uma .dll de uma câmera digital (criada em C++), e use uma função dela, chamada InicializaSDK, e estou usando JNI pra isso.

Tentei criar uma wrapper para carregar, mas tá dando um erro... aí vai o que eu tentei fazer:


1- Primeiro criei o...
...Inicia.java:




2- Depois, compilei com o javac e usei o javah pra criar o...
...Inicia.h:




3- Então, escrevi o arquivo...
...Inicia.cpp:




E daí quando tento usar o "gcc -shared Inicia.cpp -o CDSDK.dll" ele dá erro.
Alguém sabe onde eu estou errando, ou o quê eu devo fazer?
Valeu, abração!
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

Eu não queria ser chato, mas você tem como usar o Microsoft Visual Studio 2003 ou 2005? É que não sei se é possível escrever uma DLL JNI com o mingw (gcc para Windows).


[WWW]
fabriciocarraro
Entusiasta Java

Membro desde: 28/04/2008 12:58:44
Mensagens: 17
Offline

Teria sim! Ou com o DevC++ também.
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

Eu vou postar aqui uma DLL JNI que fiz faz algum tempo com o MS VC++ 6.0. O 2003 ou 2005 são parecidos, você só precisa abrir uma linha de comando (No caso do Visual Studio 2005, Start -> Programs -> Microsoft Visual Studio 2005 -> Tools -> Visual Studio Tools -> Visual Studio 2005 Command Prompt, e ele abrirá uma linha de comando em que você pode usar o "cl" (compilador de linha de comando), "nmake", etc.

TESTEJNI.CPP


TESTEJNI.H



Use as opções de linha de comando especificadas no comentário do programa Java.


[WWW]
fabriciocarraro
Entusiasta Java

Membro desde: 28/04/2008 12:58:44
Mensagens: 17
Offline

Thingol,
Valeu pela ajuda velho!
Mas então, a minha idéia era apenas chamar aquela função (void: void) já existente na CDSDK.dll (essa, uma .dll já existente também, instalada com o sw da câmera digital, provavelmente não foi criada usando os argumentos de JNI), e não preciso fazer nenhuma operação com essa função (pelo menos por enquanto não), só chamar sua execução.

E isso eu não captei ainda... e isso que me falaram de criar a wrapper.
Any idea?
fabriciocarraro
Entusiasta Java

Membro desde: 28/04/2008 12:58:44
Mensagens: 17
Offline

Nada ainda aqui =/
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

Pois é, eu postei algo que eu já tinha, só para lhe mostrar as opções de compilação.


[WWW]
fabriciocarraro
Entusiasta Java

Membro desde: 28/04/2008 12:58:44
Mensagens: 17
Offline

Sim sim, essa parte de compilar eu "sei".
O que me falta é isso de acessar uma .dll já existente pra usar uma função dela.
Sabe alguma maneira Thingol?
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

Você conhece suficientemente C? Basicamente você tem de chamar a tal função da DLL a partir da DLL JNI que você vai criar.

Se a tal DLL veio com um arquivo .H e um arquivo .LIB é fácil chamar o método InicializaSDK a partir de seu programa C.
Senão, você terá de chamar as APIs do Windows "LoadLibrary", "GetProcAddress", e "FreeLibrary".


[WWW]
fabriciocarraro
Entusiasta Java

Membro desde: 28/04/2008 12:58:44
Mensagens: 17
Offline

Conheço o suficiente pra fazer isso sim acho.
E a DLL veio sim com .H e o .LIB, mas eu nunca manipulei .LIB, não sei como fazê-lo, e não sei como (ou se) devo "linkar" o arquivo DLL JNI com o DLL que contém a função.

O que eu consegui imaginar foi o que eu postei aqui mesmo, mas sei que meu arquivo .cpp está errado, e acho que é exatamente por não estar "linkando" com o DLL ou com o LIB que você disse.

To meio perdido nessa parte.

This message was edited 1 time. Last update was at 30/04/2008 18:57:13

thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

Então tá.

1) Crie uma classe Java com apenas um método estático (digamos que seja "public native void inicializaSdk();"), e talvez um método estático para carregar a DLL (System.loadLibrary ou System.load), e a compile.
2) Use o javap para criar o arquivo .h.
3) Crie um arquivo em C ou C++ que inclua o .h criado no passo 1, e que implemente o tal método que está definido no .h. Esse arquivo em C ou C++ deve incluir também o .h que define o tal método InicializeSDK do seu toolkit.
4) Compile esse arquivo em C ou C++ e o linke com
o tal .LIB que você recebeu. Isso irá gerar a tal DLL JNI.



[WWW]
fabriciocarraro
Entusiasta Java

Membro desde: 28/04/2008 12:58:44
Mensagens: 17
Offline

Parte 1) Classe .java criada




Parte 2) Arquivo .h criado com o javah




Parte 3) Arquivo .cpp (essa parte eu não tenho certeza se está certa; eu copiei a implementação da função InicializaSDK() que estava no arquivo .cpp (o original, onde está a implementação dessa função) e coloquei em formato de JNI, mas não tenho certeza se é essa mesma a idéia. Acho que a intenção é acessar a InicializaSDK() direto da .dll ou da .lib que eu possuo, e não copiar sua implementação pra um novo .cpp, aí que eu estou me perdendo)





Parte 4) Compilei o projeto e linkei com a .LIB e a .A já existentes, assim criando a .dll, mas quando eu rodo (usando javac):




Eu estou errando no passo 3 mesmo? Eu tenho que fazer a chamada diretamente da minha .LIB ou da .DLL? Ou estou fazendo corretamente?
Abraço!
fabriciocarraro
Entusiasta Java

Membro desde: 28/04/2008 12:58:44
Mensagens: 17
Offline

Opa!
Meu orientador disse que a idéia é só chamar a função InicializaSDK() mesmo, e não declarar tudo de novo.

Dessa forma o passo 3 ficaria:




Só que assim ele não compila, diz que 'InicializaSDK' undeclared (first use this function) =/
E ah Thingol, eu tenho a .DLL, a .LIB e a .A; a .H que eu tenho define alguns métodos do corpo da função InicializaSDK() (CDStartSDK() e CDFinishSDK() como visto no post anterior), mas não nenhum que defina a própria função que eu desejo.

Abraço!
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

Hum...
Você está mostrando um arquivo .A. O que ele está fazendo aí?
Qual é o compilador que você está usando? Nunca vi ninguém dizendo que teve sucesso ao usar o mingw (gcc para Windows) para escrever DLLs JNI, por exemplo.


[WWW]
fabriciocarraro
Entusiasta Java

Membro desde: 28/04/2008 12:58:44
Mensagens: 17
Offline

O .A eu coloquei junto como parâmetro apenas pq estava na mesma pasta que o .LIB, não sei se é correto fazer isso.
Estou criando a .DLL JNI com o DevC++ mesmo.

Pra linkar a .LIB e a .A eu cliquei em "Opções de Projeto", depois na aba "Parâmetros", e na janela "Linker" eu adicionei ambos e dei OK, só isso ehehehhe
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team