Estou tendo um pequeno grande problema. Preciso utilizar uma DLL desenvolvida por outros e gostei bastante da simplicidade de se utilizar o JNA, mas estou tendo problemas com um método e seus retornos, vou explicar.
…
public int ScrubberPadronizaNome(int tipo, StringBuffer nome, int tamanho, int padronizaQualificador);
…
Esse metodo ScrubberPadronizaNome retorna um int e padroniza o nome e retorna na mesma variaval, ai eu declarei essa variavel como StringBuffer, mas o metodo DLL não suporta StringBuffer, somente String. Como posso fazer para a DLL conseguir alterar e me devolver o nome?
Não entendi muito bem a sua questão… mas se a dll não aceita stringBuffer, passa o nome como string então…
outra questão…
como retorna na mesma variável… esta variável está na dll?
dyorgio
cara, para ponteiro de String no JNA eu usso array de bytes ok?
mais tome cuidado, se o método espera uma string de 30 vc deve mandar uma
array de bytes[31],sempre 1 byte a mais,
para não prejudicar o funcionamento da dll ai depois tu da new String(teuArrayDeBytes,0,30);
e já era!
qualquer dúvida posta ai mano brown
flw
ricardofx
Pois é…a DLL não aceita StringBuffer, o que é uma meleca por que a DLL vai me retornar o nome padronizado via essa StringBuffer, por isso que não da somente passando o nome como String pq o objeto string é imutave, o StringBuffer não…ai que está o meu problema, a variavel nome tem que ser mutavel e a DLL tem que aceitar o tipo que eu estou passando.
Complicado, muito complicado, parece que eu estou girando girando e não saio do lugar.
Abraço
leopoldof:
Não entendi muito bem a sua questão… mas se a dll não aceita stringBuffer, passa o nome como string então…
outra questão…
como retorna na mesma variável… esta variável está na dll?
ricardofx
Beleza, vou tentar usar o array de bytes, mas a DLL vai conseguir alterar o seu valor como se fosse uma StringBuffer?
Abraço
Ricardo
dyorgio:
cara, para ponteiro de String no JNA eu usso array de bytes ok?
mais tome cuidado, se o método espera uma string de 30 vc deve mandar uma
array de bytes[31],sempre 1 byte a mais,
para não prejudicar o funcionamento da dll ai depois tu da new String(teuArrayDeBytes,0,30);
e já era!
qualquer dúvida posta ai mano brown
flw
dyorgio
Claro cara!
em Java não exixtem ponteiros( existem mais não existem ,jaehhaehahe)
então vc usa array de bytes como ponteiro de String
o JNA aceita isso na boa e preenche esse seu array perfeitamente
só não esqueça do byte a mais…pois senão estoura memória e o Programa gecha
na hora.
Abs,
ricardofx
Dae dyorgio, então cara eu fiz o seguinte…ve se eu to fazendo certo.
.
.
. String strNome = new String(“ENGENHEIRO RICARDO JOSÉ MACCAGNAN PINHEIRO”); // String que eu quero padronizar
byte[] btNome = strNome.getBytes(); //Transformei a String num array de bytes
int retorno = interfaceScrubber.ScrubberPadronizaNome(70, btNome, 30, 1);
.
.
.
70 é o código de pessoa fisica
btNome é o nome que eu quero padronizar
30 é o tamanho que eu quero que a DLL me devolva a String padronizada
1 indica se os qualificadores serão utilizados
E essa é a interface
.
.
.
public int ScrubberPadronizaNome(int tipo, byte[] btNome, int tamanho, int padronizaQualificador);
.
.
.
Se você puder me dar uma mão vai ser show de bola, pq assim a comunicação com a DLL funciona mas ela não altera a variavel btNome com o nome padronizado.
Abração
Ricardo
dyorgio:
Claro cara!
em Java não exixtem ponteiros( existem mais não existem ,jaehhaehahe)
então vc usa array de bytes como ponteiro de String
o JNA aceita isso na boa e preenche esse seu array perfeitamente
só não esqueça do byte a mais…pois senão estoura memória e o Programa gecha
na hora.
Abs,
dyorgio
A dll em questão é sua?
pois pelo que estou vendo ela não esta preenchendo
o “ponteiro” que ela recebe,
somente assim para funcionar,
se internamente o método da dll
esta fazendo algo do tipo
btNome = novoNomePadronizado
ai esta o erro, pois isso não é preencher, e sim sobreescrever
o conteúdo…
se a DLL não for sua, vc se certificou que funciona em C?
se a DLL for sua, de uma olhada em como vc atricui o valor para o retorno
Abs,
ricardofx
A DLL não é minha…essa que é a meleca!
Vou tentar entrar em contato com quem desenvolveu pra ver se ele resolve o problema…valeu a força irmão!
Abraço
Ricardo
dyorgio:
A dll em questão é sua?
pois pelo que estou vendo ela não esta preenchendo
o “ponteiro” que ela recebe,
somente assim para funcionar,
se internamente o método da dll
esta fazendo algo do tipo
btNome = novoNomePadronizado
ai esta o erro, pois isso não é preencher, e sim sobreescrever
o conteúdo…
se a DLL não for sua, vc se certificou que funciona em C?
se a DLL for sua, de uma olhada em como vc atricui o valor para o retorno
Abs,
gobbo
ola amigo
tive o mesmo problema um tempo atras
e te falo uma coisa:
sua dll eh um componente ActiveX?
se nao for, faça um projeto em VB ou C++ e torne-a um componente…
ficará muito mais facil vc trabalhar com ela usando JACOB…
abs
F
f-schmitt
olá pessoal!
esse topico não é movimentado há tempos,
estou iniciando uns testes com JNA e tenho uma dúvida:
tenho dll ´s geradas com a IDE/linguagem Clarion, essas dll podem ser executadas utilizando JNA?
um abraço
gobbo
Olá Amigo
voce sabe que tipo de compilação essa linguagem gera essa DLL?
é um componente ActiveX?
dê uma olhada tambem no JACOB…
se nao der, volte que a gente tem outras ideias… mas vamos por partes
I
ivandm
Olá galera,
Estou usando JNA para acessar dll.
Estou com um problema de acesso a uma dll (elgin.dll).
Simplesmente não responde, não dá erro, não faz nada! hehe
Não sei o que pode ser.
é uma impressora não fiscal Elgin wind.
Ela usa 2 dlls ( elgin.dll e inpout32.dll)
Obrigado.
gobbo
olá amgo
voce tem a descrição da biblioteca? Em que ela foi desenvolvida?
Esses frameworks (JNA Jacob entre outros) só funcionam em bibliotecas componentizadas (ActiveX Component).
Caso contrario, voce terá que criar um Bridge em C (os famosos cabeçalhos .h da JNI)… dai voce acessa eles como JNI Native Method…
I
ivandm
Olá!
Somente tenho um arquivo de ajuda da dll. Somente os nomes das funções!
Provavelmente deve ser feita em C.
Tem algum exemplo desse cabeçalho pra que eu possa testar?