Nesta última semana estou estudando o tempo todo Java -> DLL JNI -> DLL. Fiz muitos progressos. Estou conseguindo passar parâmetros e receber retorno de funções da DLL.
Só que nem tudo são flores…
Na minha DLL tem um método com a seguinte assinatura:
EXPORT void swap(int*, int*);
Como vcs podem ver as duas variáveis são passadas por referência. Essa função faz o seguinte:
int a =3; int b=2;
printf("antes da troca a=%d b=%d",a,b); //antes da troca a=3 b=2
swap(a,b);
printf("depois da troca a=%d b=%d",a,b); //antes da troca a=2 b=3
Agora vem o problema:
A assinatura do meu método em Java é:
public native void swap(int a, int b);
E sabendo que valores primitivos são passados por valor, como faço para obter o mesmo comportamento que obtenho em C++?
Obs: Já troquei a assinatura por swap(Integer a, Integer b) e simplesmente não houve a troca, ou seja, o JNI passou a cópia do valor e não da referência.
A resposta mais simples para você é: se não consegue fazer um swap de duas variáveis int em Java puro, não vai conseguir fazer usando JNI. Java não é C# e não admite parâmetros por referência. Mesmo em C# a passagem de parâmetros por referência é a exceção, em vez da regra, e requer o uso da palavra-chave “ref”, tanto na declaração quanto na chamada do método.
De qualquer maneira, digamos que você usasse esse esquema do swap para duas variáveis do tipo Integer.
Uma característica das classes wrapper é que os valores representados são imutáveis.
Não é difícil em JNI acessar os membros privados da classe Integer que representam o valor, mas aí você estaria violando essa característica da classe Integer. Isso é mais grave quando você estiver usando o Java 5.0. É que nessa versão do Java existem 256 valores prefixados da classe Integer (de -128 a +127) já prealocados pela JVM. Se por acaso você passar um desses valores para sua função, vai provocar erros esquisitos depois em seu programa.
Thingol, nunca subestime ninguém! Por melhor que vc seja vc não pode achar que a pessoa para quem vc está dando a resposta não está a altura da mesma. A resposta mais simples que tem é a própria resposta.