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.
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
thingol
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
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++!!
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?