JNA com DLL da ECF Urano (Protocolo Fiscnet)

4 respostas
giulianon

Boa tarde colegas!

Estou com dificuldade para ler informações (coo, cro,etc) da ecf urano modelo pos-logger.

Estou utilizando JNA para acessar a dll como já faço com as ecfs Bematech e Sweda e funcionam perfeitametne.

Mas no caso da urano só estou conseguindo até o momento enviar os comandos para impressão.

Quando preciso fazer as consultas, a função da dll não retorna erro mas também não retorna a informação.

Vou postar aqui o código para a leitura do coo pra ficar mais claro.

public void consultaCOO() {
        dll.DLLG2_LimpaParams(handle);
        dll.DLLG2_AdicionaParam(handle, "NomeInteiro", "coo", 7);
        int i = dll.DLLG2_ExecutaComando(handle, "LeInteiro");        
        if (i > 0) {            
            i = dll.DLLG2_ObtemCodErro(handle);
            if (i == 0) {
                long tm = 50;
                long tr = 6;
                byte[] retorno = new byte[6];
                if (dll.DLLG2_Retorno(handle, 0,"ValorInteiro", tm, retorno, tr) > 0) {
                    System.out.println("Coo: " + new String(retorno));
                } else {
                    System.out.println("Nenhum byte de retorno");
                    System.out.println("Retorno: " + retorno);
                }
            } else {
                String erro = "";
                erro = dll.DLLG2_ObtemNomeErro(handle, erro, 0);
                System.out.println("Erro:" + erro);
                String descricaoErro = "";
                descricaoErro = dll.DLLG2_ObtemCircunstancia(handle, descricaoErro, 0);
                System.out.println("Circunstancia:" + descricaoErro);
            }
        }        
    }

Bom segundo o manual da dll devo passar uma string como referência para a função da dll chamada DLLG2_Retorno que vai me devolver a informação na mesma.

Como Strings em java são imutáveis segui o mesmo principio das implementações usando outras DLLs e também a documentação do JNA e estou passando um array de bytes no lugar de um tipo String.

Já tentei também seguir alguns exemplo que encontrei em outros tópicos aqui do GUJ que trabalham com PointerByReference e também não funcionou.

Consultei o pessoal do suporte da urano e os mesmos não suporte a java.

Só me passaram que a DLL foi feita em C++ e que a função em questão precisa de um parametro do tipo String mesmo.

Também me passaram exemplo em Dephi que funcionou certinho me devolvendo o COO.

É isso!

Espero que alguém já tenha enfrentado esse problema e possa me ajudar com alguma dica, sugestão, exemplo, etc.

Abraço a todos!

Obrigado!

Giu

4 Respostas

J

Empacota o array em um Object, que é a mesma coisa que um ponteiro. Um string em c++ não é um array de byte e sim um array de char.

Provavelmente o erro está justamente no tipo byte, já que um byte em java é um tipo sinalizado, e um byte em c++ é um char não sinalizado.

giulianon

juliocbq:
Empacota o array em um Object, que é a mesma coisa que um ponteiro. Um string em c++ não é um array de byte e sim um array de char.

Provavelmente o erro está justamente no tipo byte, já que um byte em java é um tipo sinalizado, e um byte em c++ é um char não sinalizado.

Alterei o tipo de byte pra char e não funcionou.

Não entendi muito bem o que seria empacotar o array em um object.

Desculpe a minha ignorância mas será que poderia me dar um exemplo?

Obrigado!

Giu

J

Você pode guardar um array em um Object. Um Object é como um ponteiro (void*).
Object a = array;

Normalmente se um método pede um ponteiro (void*) você pode usar um Object como parâmetro.

giulianon

juliocbq:
Você pode guardar um array em um Object. Um Object é como um ponteiro (void*).
Object a = array;

Normalmente se um método pede um ponteiro (void*) você pode usar um Object como parâmetro.

Bom alterei pra que ficasse dessa forma:

public void consultaCOO() { dll.DLLG2_LimpaParams(handle); dll.DLLG2_AdicionaParam(handle, "NomeInteiro", "coo", 7); int i = dll.DLLG2_ExecutaComando(handle, "LeInteiro"); if (i > 0) { i = dll.DLLG2_ObtemCodErro(handle); if (i == 0) { long tm = 50; long tr = 6; Object retorno = new char[6]; ////////////////////////////////////////////////// Array de char em um object if (dll.DLLG2_Retorno(handle, 0,"ValorInteiro", tm, retorno, tr) > 0) { System.out.println("Coo: " + retorno); } else { System.out.println("Nenhum byte de retorno"); System.out.println("Retorno: " + retorno); } } else { String erro = ""; erro = dll.DLLG2_ObtemNomeErro(handle, erro, 0); System.out.println("Erro:" + erro); String descricaoErro = ""; descricaoErro = dll.DLLG2_ObtemCircunstancia(handle, descricaoErro, 0); System.out.println("Circunstancia:" + descricaoErro); } } }

Mas infelizmente não funcionou.

Criado 5 de maio de 2010
Ultima resposta 6 de mai. de 2010
Respostas 4
Participantes 2