Chamando metodos nativos dll em java sem jni

7 respostas
i_Coder

Bom dia pessoal do GUJ.

Sou novo aqui e tb não muito experiente em java. Estou com uma dúvida quanto ao uso do JNA e gostaria de pedir ajuda para vocês que tem boa bagagem e experiência.

Problema é assim: Estou fazendo um código em java (tentando uso do JNA) para me comunicar com relógio ponto da empresa. A linguagem da dll dos relógios é em delphi, e eu tenho acesso as assinaturas dos métodos.

Minha dúvida consiste basicamente em como eu vou declarar estes parâmetros dos métodos no meu código java qdo eles não são do tipo primitivo.

A príncipio eu só quero fazer meu programa se conectar ao relógio e enviar um beep e apartir dai eu posso continuar (pois vou saber que há possibilidade). Não creio q isto não possa ser possível pois pelo que entendi é justamente para estas situações que o JNA foi criado.

Meu código esta bem simples, eu fiz seguindo todos os passos que o Urubatan sugeriu no seu blog:

Minha interface

package teste;

import com.sun.jna.Library;

interface InterfaceBip extends Library {

public int AdicionaCardTcpip(String pIp, int pPorta, String pCatraca, String pModoComunicacao);

public String EnviaBeep(int pThreadIndex, String pBeep);

}

Minha classe (já com os erros na imagem de baixo)

package teste;

import com.sun.jna.Native;

public class ClasseBip {

InterfaceBip bip = (InterfaceBip) Native.loadLibrary(Kernel7x, InterfaceBip.class);

bip.AdicionaCardTcpip(192.168.0.56,3000,"",cmcOffline);

bip.EnviaBeep(0,cbliberado);
}

}

Assinatura dos métodos que estou usando:

AdicionaCardTcpip(pIp, pMac : WideString; pPorta : Integer; pCatraca :
WordBool; pModoComunicacao : SModoComunicacao) : Integer;

EnviaBeep(pThreadIndex: Integer; pBeep: SBeep): WordBool;

Agradeço desde já quem puder me ajudar, pois estou sem saber o q fazer já.
Toda ajuda é bem vinda.

[aB[R]Aç[[o]]s]

[[|]] 'Até

7 Respostas

i_Coder

Por favor me desculpem se postei no fórum errado. É que vi algumas msgs de JNA aqui no JAVA AVANÇADO e acreditei que poderia. Mas, se quiserem mover ou mesmo que eu passe para outro fórum não tem problema.

[aB[R]Aç[[o]]s]

[[|]] 'Até

xandevieira

vc tem que implementar a inteface InterfaceBip

i_Coder

Bom dia avsouza, veja bem, eu implementei a interface, olhe esta linha:

InterfaceBip bip = (InterfaceBip)

[aB[R]Aç[[o]]s]

[[|]] 'Até

i_Coder

Arrumei minhas classes e os erros “desapareceram”. Porém qdo executo obtenho o seguinte erro:

Exception in thread “main” java.lang.UnsatisfiedLinkError: Error looking up function ‘AdicionaCardTcpip’:
Não foi possível encontrar o procedimento especificado.

at com.sun.jna.Function.(Function.java:126)

at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:219)

at com.sun.jna.Library$Handler.invoke(Library.java:191)

at teste.$Proxy0.AdicionaCardTcpip(Unknown Source)

at teste.ClasseBip.main(ClasseBip.java:16)

Interface

package teste;

import com.sun.jna.Library;

interface InterfaceBip extends Library {

public int AdicionaCardTcpip(String pIp, int pPorta, String pCatraca, String pModoComunicacao);

public String EnviaBeep(int pThreadIndex, String pBeep);

}

Classe

package teste;

import com.sun.jna.Native;

public class ClasseBip {

public static void main(String args[]){

InterfaceBip bip = (InterfaceBip) Native.loadLibrary(Kernel7x, InterfaceBip.class);
bip.AdicionaCardTcpip("192.168.0.226",3000,"","cmcOffline");
            bip.EnviaBeep(0,"cbliberado");

}

}

O que estou fazendo de errado pessoal?

[aB[R]Aç[[o]]s]

[[|]] 'Até

i_Coder

Boa tarde pessoal.

Estive olhando a documentação do JNA e pelo que percebi justamente esses erros que aconteceram no meu código são devidos a passagem de parâmetros para o código nativo. A maneira de passar os parâmetros para o código nativo que contem parâmetros de tipos não primitivos não pode ser feita da maneira que fiz no código acima.

Na documentação vi algumas saidas para o problema, tipo:

public interface TypeMapper

Provides converters for conversion to and from native types.

getFromNativeConverter
FromNativeConverter getFromNativeConverter(Class javaType)
Return the FromNativeConverter appropriate for the given Java class.

getToNativeConverter
ToNativeConverter getToNativeConverter(Class javaType)
Return the ToNativeConverter appropriate for the given Java class.

Tb vi:

Alternatively, user-defined types may implement the NativeMapped interface, which determines conversion to and from native types on a class-by-class basis.

Único problema é que não estou sabendo a maneira de alocar estas alternativas no meu código.

Ainda assim, será essa a idéia ou estas alternativas não tem nada a ver?

[aB[R]Aç[[o]]s]

[[|]] 'Até

i_Coder

Bom dia pessoal.

Gostaria de saber se alguém pode dar uma help quanto ao uso desta classe:

[size=24]Class NativeMappedConverter[/size][/size]

Pelo que postei acima, essa pode ser uma das saídas, mas, não estou conseguindo colocar isto no código.

Espero a colaboração de todos ai que puderem e quiserem ajudar.

[aB[R]Aç[[o]]s]

[[|]] 'Até

i_Coder

Aqui está a documentação da classe que postei acima:

https://jna.dev.java.net/javadoc/com/sun/jna/NativeMappedConverter.html

[aB[R]Aç[[o]]s]

[[|]] 'Até

Criado 27 de março de 2008
Ultima resposta 28 de mar. de 2008
Respostas 7
Participantes 2