Obrigado, juliocbq. Realmente era o que eu estava procurando. Agora já consigo acessar o ponteiro passado como parâmetro por referência. Como java não possui o tipo sem sinal, então tive que operar diretamente nos bits. Tive que fazer assim:
No entanto, mesmo quando o array de “unsigned char” possui mais de 4 parâmetros, eu não consigo acessar o quinto elemento, por exemplo. No trecho do código onde há uma chamada a byte[] baite = p.getByteArray(0, 4); se eu trocar por byte[] baite = p.getByteArray(0, 5);, É lançada a excessão: java.lang.IndexOutOfBoundsException. Alguém tem ideia por que está acontecendo isso?
J
juliocbq
gillianoPE:
O problema é que em java não tem byte não sinalizado (0 -255).
Leia aqui para entender melhor a dor de cabeça que isso causa. Você vai precisar desse texto.
Obrigado, juliocbq. Realmente era o que eu estava procurando. Agora já consigo acessar o ponteiro passado como parâmetro por referência. Como java não possui o tipo sem sinal, então tive que operar diretamente nos bits. Tive que fazer assim:
No entanto, mesmo quando o array de “unsigned char” possui mais de 4 parâmetros, eu não consigo acessar o quinto elemento, por exemplo. No trecho do código onde há uma chamada a byte[] baite = p.getByteArray(0, 4); se eu trocar por byte[] baite = p.getByteArray(0, 5);, É lançada a excessão: java.lang.IndexOutOfBoundsException. Alguém tem ideia por que está acontecendo isso?
Então giliano, acho que agora vc marcou. É o seguinte:
digamos que seu vetor de vetor de bytes, que é um ponteiro para um ponteiro (usigned char** pt), ou seja uma matriz possui mais de 4 elementos ok?
O índice de procura sempre começa em 0(zero). O quinto elemento seria p.getByteArray(0,4), e não p.getByteArray(0,5). É a idéia que tive quando vi seu código. Para ter certeza, use um breakpoint, depure e observe o que existe dentro do seu ponteiro.
G
gillianoPE
Então, julio… Pra deixar mais claro o que estou tentando fazer:
Código C que gera a DLL:
Tudo que eu preciso é ter acesso a todos os elementos de meu vetor de “unsigned char”. Só que, mesmo sabendo que originalmente a minha DLL altera o ponteiro passado por referencia para ter acesso a um vetor de 6 elementos, quando eu faço uma chamada no Java a p.getByteArray(0,6) é lançada a exceção:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Bounds exceeds available space : size=4, offset=6
at com.sun.jna.Memory.boundsCheck(Memory.java:168)
at com.sun.jna.Memory.read(Memory.java:185)
at com.sun.jna.Pointer.getByteArray(Pointer.java:753)
at jna_test.Main_Test.main(Main_Test.java:40)
O que acho estranho é ele sempre “acreditar” que meu vetor é de 4 elementos. Esclareceu um pouco mais o meu problema?
J
juliocbq
gillianoPE:
Então, julio… Pra deixar mais claro o que estou tentando fazer:
Código C que gera a DLL:
Tudo que eu preciso é ter acesso a todos os elementos de meu vetor de “unsigned char”. Só que, mesmo sabendo que originalmente a minha DLL altera o ponteiro passado por referencia para ter acesso a um vetor de 6 elementos, quando eu faço uma chamada no Java a p.getByteArray(0,6) é lançada a exceção:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Bounds exceeds available space : size=4, offset=6
at com.sun.jna.Memory.boundsCheck(Memory.java:168)
at com.sun.jna.Memory.read(Memory.java:185)
at com.sun.jna.Pointer.getByteArray(Pointer.java:753)
at jna_test.Main_Test.main(Main_Test.java:40)
O que acho estranho é ele sempre “acreditar” que meu vetor é de 4 elementos. Esclareceu um pouco mais o meu problema?
Esclareceu sim. O ponteiro está corrompendo os dados. Precisa depurar para ver o que tem dentro do ponteiro, e ver o que está saindo errado.