Quebrando cabeça - JAWIN

10 respostas
ranophoenix

Alguém já utilizou esta ferramenta?

A situação é a seguinte:

Uma empresa X tem uma DLL responsável por acessar e fornecer certos recursos do sistema. Essa empresa X quer que meu programa em Java utilize esta DLL para obter estes recursos.

Antes de tentar usar a DLL do meu cliente estou tentando utilizar as DLLs do próprio Windows. Consegui chamar um MessageBoxW (tem no user guide do jawin) até aí tudo bem, pois o MessageBoxW só tem dois parâmetros de entrada. Aí fui inventar de invocar um outro método um pouquinho mais complexo, chamei o GetDiskFreeSpace que tem um parâmetro de entrada e 4 de saída. Resultado: Não estou conseguindo.

Alguém já tentou fazer algo parecido?

10 Respostas

Luca

Olá

Porque não usa JNI diretamente? Não sabe C? Use os exemplos da Sun. Acho que mesmo sem saber C é facil fazer algo para intermediar Java com DLLs.

[]s
Luca

T

Hum, agora vi qual é o seu problema com o JAWIN. (usando GetFreeDiskSpaceEx). Não use GetFreeDiskSpace porque ele não funciona com os HDs de hoje em dia, que têm mais de 4GB de espaço.
É que ele não pensou no suporte ao long do Java (que seria o __int64 do C++).
Então usar “A” na string de especificação não ajuda.
Você precisaria pensar no PULONG_INTEGER como se fosse um ponteiro para uma struct com 8 bytes, e converter esses 8 bytes para um long do Java. Ou sja, dá para fazer com o JAWIN mas dá um pouco de trabalho.
Nesse caso em particular é melhor usar a DLL da empresa X, ou então fazer um JNI só para isso.

ranophoenix

Vcs acham que é melhor fazer usando JNI diretamente?

Nunca fiz nada em C++ e pior ainda em C. vcs acham que mesmo assim continua valendo a pena correr atrás do prejuízo e fazer usando JNI puro?

Luca

Olá

É mais fácil aprender o pouco de C necessário para usar JNI do que descobrir dentro dos meandros da API do Windows qual método usar para obter cada informação.

Eu fiz uma aplicação usando JNI que obtem quase todas as informações da máquina e dos processos em execução. Apesar de vasculhar muito o MSDN, nunca consegui obter todas as informações que o AIDA32 ou o Everest mostram.

[]s
Luca

ranophoenix

Luca,

só estou usando as APIs do windos para estudo, pq meu objetivo final é acessar funções de uma dll q já existe e já está funcionando. Tenho a assinatura de todos os métodos destas dll. O problema é que não sei como chamá-los. Se fosse em VB ou Delphi seria tranquilo :slight_smile:

Lendo a documentação da Sun vi aquela aplicação HelloWorld e reparei q o código da dll que serve de ponte tem um jni.h q com certeza absoluta não é o caso da dll que vou usar da empresa X.

Vou ter que escrever um código em C/C++ para acessar esta dll fazendo métodos wrappers para a dll que já está implementada?

Luca

Olá

Sim, um código C intermediário que recebe parametros do Java e passa para a DLL e depois recebe da DLL e devolve ao Java.

Acho mais produtivo e de mais serventia no futuro aprender a usar JNI do que seguir estas gambiarras as vezes mal documentadas tipo JAWIN.

Mas quando a gente não sabe fazer uma coisa não é pecado pagar para quem sabe. Contrate um dia de programador C que sairá mais barato do que ficar tentando abraçar o mundo.

[]s
Luca

ranophoenix

Valeu mesmo galerar!

Obrigadão Luca! Vou estudar JNI e falar para a empresa contratar um programador em C/C++!!

:wink:

Luca

Olá

Repare que eu disse contratar por apenas um dia. Na verdade não é necessário mais do que 45 minutos.

[]s
Luca

louds

Se o cara for só um pouquinho esperto, vai usar http://www.swig.org com o header da dll e ir pro rh pegar a grana.

ranophoenix

louds,

pelo que vi no tutorial do swig, eu teria que ter o header e os fontes também? ou não?

http://www.swig.org/tutorial.html

pq a única coisa q tenho em minhas mãos é a dll já compilada. Ah! E tenho a documentação desta dll tb.

Criado 11 de julho de 2005
Ultima resposta 12 de jul. de 2005
Respostas 10
Participantes 4