JNDI, dll, UnsatisfiedLinkError

Pessoas,

Como nunca tinha feito nada com JNI, fui, claro, dar uma googleada por aí (e uma GUJeada por aqui, também) para entender alguma coisa. Confesso que ainda estou meio no ar, mas vamos lá:

Tenho uma dll aqui de uma empresa que fornece pin pads. Os caras mandaram a dll junto com um exemplo em VB (que funciona). Desculpando pela injúria, mas eu tenho essa definição de função da dll, feita em VB:

Declare Function iOpenSuperPin Lib "superpin.dll" (ByVal uiDeviceNumber As Integer, ByVal caErrorMessage As String, ByVal ucCountKey As Byte) As Integer

Eu tentei usar essa função da DLL em Java utilizando o seguinte código:

[code] public static native void iOpenSuperPin(int uiDeviceNumber, String caErrorMessage, int unCountKey);

static {
System.load(“C:/WINNT/system32/SUPERPIN.DLL”);
}

String x = “”;
iOpenSuperPin(1,x,0);

[/code]

Bem, como já devem ter adivinhado, consegui a seguinte resposta:

java.lang.UnsatisfiedLinkError: iOpenSuperPin

Em um momento anterior, essa mesma exception estava ocorrendo em relação a própria DLL (dava erro no System.load), mas corrigi isso passando o full path.

Talvez a frase “vc precisa estudar mais JNI” caiba aqui, mas isso aqui parece muito simples pro que já andei vendo.

Alguma luz?

Obrigado!

A coisa é bem mais complicada do que parece. Você vai precisar criar uma dll “ponte” entre a sua classe e a dll fornecida ou usar uma solução que já faça essa ponte pra você. A assinatura da função na dll precisa ser completamente diferente para funcionar diretamente via JNI.

Uff… vou ter que gerar o tal .h via javah e etc e tal, é isso?

Sim, e ainda escrever a .dll ponte :slight_smile: Ou usar soluções que façam isso pra você, o que será muito mais simples.

Pior, vai ter que programar em C, por que o h não faz nada.

Ahn… tipo o quê? :oops:

Legal. :?

Ahn… tipo o quê? :oops: [/quote]

Depende. Existem soluções pra dlls “puras”, dlls com componentes COM e ambas. Verifique qual o caso da dll em questão e dá uma procurada no Google e faz um teste com o que você encontrar.

Infelizmente, a última vez que precisei disso pra algo sério, ainda não existiam essas soluções abertas pra isso. No java.net lembro de visto algo bem legal pra chamar dlls que contém componentes COM, mas agora não lembro o nome.

Olá

JNI é bem fácil se você programa em C e tem o Visual Studio 6 por ai. Um pouquinho menos facil se você usa um outro compilador C que pode criar uma dll incompatível (digo pode, não é que vai acontecer). Veja os exemplos de JNI no próprio site da Sun. A dll em C é minúscula. Sua maior dificuldade será entender os parâmetros.

Como o mister_m disse, há por aí pontes que lhe serviriam. Nunca usei porque sempre usei JNI diretamente.

Mas o principal motivo da minha mensagem é dizer que talvez você possa se comunicar com o PINpad diretamente usando javax.comm. Foi assim que usei PINpad.

[]s
Luca

Para chamar DLLs COM use o Jacob ( http://danadler.com/jacob ) ou o NJAWIN.
Para chamar DLLs puras (as que você tem de chamar com Declare Function): você pode escrever a DLL JNI, ou então usar o SWIG ( http://www.swig.org/ ).
Obviamente nunca usei os dois, só escrevi DLLs JNI, e particularmente acho meio arriscado (nunca iria usar uma DLL JNI dentro de um application ou web server como o Tomcat ou o JBoss; deixaria essas DLLs em um processo Java separado, para evitar que algum problema no código nativo provocasse um crash no application server, e comunicaria via sockets).
Se a tal da DLL só faz algo muito bobo (encapsulamento da comunicação serial, por exemplo), é possível simplesmente jogar essa DLL fora, e escrever o código usando javax.comm.

Sim, sim, sim. Já estava meio que partindo para esse lado, mesmo. A questão da DLL foi uma visão de que talvez fosse mais tranquilo.

(e um pouquinho também daquela coisa de “como será que isso aqui funciona?” que todo programador tem… :slight_smile: )

Vou deitar em cima desses códigos hexadecimais das especificações dos pins. Talvez eu volte aqui em breve para perguntas sobre javax.comm!

Obrigado a todos!

Olá

Programar usando PINpad exige alguns conhecimentos específicos de Java. Há a questão da criptografia, a comunicação via javax.comm ou JNI e ainda escrever mensagens sucintas e claras para o cliente na telinha do PINpad.

Boa sorte para você, acho que já tem diversão garantida.

Minha sugestão:

  1. Se não sabe nada de javax.comm mas conhece um pouco de C: comece com JNI que é bem facinho e rápido de colocar a coisa para funcionar. A performance ficará ruim pois a conversão dos objetos Java para a DLL para depois comunicar com o PINpad é onerosa.

  2. Em paralelo, estude ou ponha alguém para estudar javax.comm. Você precisará controlar o protocolo de comunicação com o PINpad mas não é bicho de sete cabeças. Depois de dominado javax.comm troque a solução JNI por javax.comm.

  3. Se não conhece absolutamente nada de C parta direto para javax.comm.

[]s
Luca

Bem, não há criptografia, pq são PINs só para coleta de dados, nada de senhas. E como já fiz trabalhos de automação em outra empresa, estou acostumado em “tentar” utilizar mensagens claras, mesmo com a limitação da tela.

Estou bem proximo a isso! :slight_smile: Conheço um pouco de C, mas acho que não vale a pena insistir. Se ainda fosse apenas para UMA máquina, até valeria, mas como o parque vai ser maior, me sinto mais a vontade com Java.

Valeu, Luca!