JNDI, dll, UnsatisfiedLinkError  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
dreamspeaker
GUJ Ranger
[Avatar]

Membro desde: 22/04/2003 10:09:58
Mensagens: 752
Localização: SP - Capitar
Offline

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:



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



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



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!


André Barbosa
Para de encher o saco e vai doar sangue!
twitter
[Email] [WWW]
mister__m
Virtual Machine Man
[Avatar]

Membro desde: 18/03/2005 16:13:17
Mensagens: 736
Offline

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.

Michael Nascimento Santos, aka Mister M

Summa Technologies do Brasil - http://www.summa-tech.com/
genesis: Uma nova forma de desenvolver aplicações - https://genesis.dev.java.net/
ThinNB: Suporte a Thinlet no NetBeans - https://thinnb.dev.java.net/
Líder da JSR-310 - Date and Time API
Expert Group Member das JSRs 207 (PD4J), 250 (Common Annotations), 270 (Java 2 SE 6.0), 296 (Swing Framework) e 303 (Bean Validation)
SouJava: Fortalecendo a comunidade Java brasileira - https://soujava.dev.java.net/ https://www.soujava.org.br/
JSR Community @ java.net - http://community.java.net/jsr
Blogs - http://blog.michaelnascimento.com.br/ http://today.java.net/pub/au/80
Twitter - @mr__m
[WWW]
dreamspeaker
GUJ Ranger
[Avatar]

Membro desde: 22/04/2003 10:09:58
Mensagens: 752
Localização: SP - Capitar
Offline

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

André Barbosa
Para de encher o saco e vai doar sangue!
twitter
[Email] [WWW]
mister__m
Virtual Machine Man
[Avatar]

Membro desde: 18/03/2005 16:13:17
Mensagens: 736
Offline

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


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

This message was edited 1 time. Last update was at 18/04/2005 17:27:31


Michael Nascimento Santos, aka Mister M

Summa Technologies do Brasil - http://www.summa-tech.com/
genesis: Uma nova forma de desenvolver aplicações - https://genesis.dev.java.net/
ThinNB: Suporte a Thinlet no NetBeans - https://thinnb.dev.java.net/
Líder da JSR-310 - Date and Time API
Expert Group Member das JSRs 207 (PD4J), 250 (Common Annotations), 270 (Java 2 SE 6.0), 296 (Swing Framework) e 303 (Bean Validation)
SouJava: Fortalecendo a comunidade Java brasileira - https://soujava.dev.java.net/ https://www.soujava.org.br/
JSR Community @ java.net - http://community.java.net/jsr
Blogs - http://blog.michaelnascimento.com.br/ http://today.java.net/pub/au/80
Twitter - @mr__m
[WWW]
louds
Moderador
[Avatar]

Membro desde: 29/04/2003 23:09:15
Mensagens: 4061
Localização: São Paulo
Offline

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

http://www.kumpera.net/blog/
http://www.mono-project.com/
"Each individual should work for himself. People will not sacrifice themselves for the company. They come to work at the company to enjoy themselves."
Soichiro Honda
[ICQ]
dreamspeaker
GUJ Ranger
[Avatar]

Membro desde: 22/04/2003 10:09:58
Mensagens: 752
Localização: SP - Capitar
Offline

mister__m wrote:... Ou usar soluções que façam isso pra você, o que será muito mais simples.


Ahn... tipo o quê?

louds wrote:Pior, vai ter que programar em C, por que o h não faz nada


Legal.

André Barbosa
Para de encher o saco e vai doar sangue!
twitter
[Email] [WWW]
mister__m
Virtual Machine Man
[Avatar]

Membro desde: 18/03/2005 16:13:17
Mensagens: 736
Offline

dreamspeaker wrote:
mister__m wrote:... Ou usar soluções que façam isso pra você, o que será muito mais simples.


Ahn... tipo o quê?


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.

Michael Nascimento Santos, aka Mister M

Summa Technologies do Brasil - http://www.summa-tech.com/
genesis: Uma nova forma de desenvolver aplicações - https://genesis.dev.java.net/
ThinNB: Suporte a Thinlet no NetBeans - https://thinnb.dev.java.net/
Líder da JSR-310 - Date and Time API
Expert Group Member das JSRs 207 (PD4J), 250 (Common Annotations), 270 (Java 2 SE 6.0), 296 (Swing Framework) e 303 (Bean Validation)
SouJava: Fortalecendo a comunidade Java brasileira - https://soujava.dev.java.net/ https://www.soujava.org.br/
JSR Community @ java.net - http://community.java.net/jsr
Blogs - http://blog.michaelnascimento.com.br/ http://today.java.net/pub/au/80
Twitter - @mr__m
[WWW]
Luca
Moderador
[Avatar]

Membro desde: 06/09/2002 14:30:10
Mensagens: 5810
Localização: São Paulo/SP ou Paraty/RJ
Offline

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

Dare Obasanjo (Program Manager at Microsoft)
"The folks I know from across the industry who have to build large scale Web services on the Web today at Google, Yahoo!, Facebook, Windows Live, Amazon, etc are using RESTful Web services. The only times I encounter someone with good things to say about WS-* is if it is their job to pimp these technologies or they have already "invested" in WS-* and want to defend that investment."


CEP, JMS, JMX e coisas afins (ou não)
http://lucabastos.blogspot.com/
[Email] [WWW]
thingol
Moderador

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

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.



[WWW]
dreamspeaker
GUJ Ranger
[Avatar]

Membro desde: 22/04/2003 10:09:58
Mensagens: 752
Localização: SP - Capitar
Offline

Luca wrote: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.


thingol wrote: 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... )

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!

André Barbosa
Para de encher o saco e vai doar sangue!
twitter
[Email] [WWW]
Luca
Moderador
[Avatar]

Membro desde: 06/09/2002 14:30:10
Mensagens: 5810
Localização: São Paulo/SP ou Paraty/RJ
Offline

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

Dare Obasanjo (Program Manager at Microsoft)
"The folks I know from across the industry who have to build large scale Web services on the Web today at Google, Yahoo!, Facebook, Windows Live, Amazon, etc are using RESTful Web services. The only times I encounter someone with good things to say about WS-* is if it is their job to pimp these technologies or they have already "invested" in WS-* and want to defend that investment."


CEP, JMS, JMX e coisas afins (ou não)
http://lucabastos.blogspot.com/
[Email] [WWW]
dreamspeaker
GUJ Ranger
[Avatar]

Membro desde: 22/04/2003 10:09:58
Mensagens: 752
Localização: SP - Capitar
Offline

Luca wrote: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.


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.

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


Estou bem proximo a isso! 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!

This message was edited 1 time. Last update was at 18/04/2005 18:46:23


André Barbosa
Para de encher o saco e vai doar sangue!
twitter
[Email] [WWW]
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team