Ok pessoal,
vc estão falando de passagem por referência dentro da própria linguagem : de Java para Java , de C/C++ para C/C++.
E se for Java para C/C++???
Eu tenho a seguinte situação:
eu quero acessar objetos no Java pelo C via JNI usando passagem por referência pois o volume de dados pode ser imenso e eu não quero ter que fazer a JVM duplicar minhas variáveis na memória passando parâmetros por valor pra lá e pra cá.
O que acontece é que temos uma DLL desenvolvida em C e ela é utilizada em uma linguagem que aceita acesso direto a ponteiros, o que fazemos então é fornecer para a DLL os endereços dos valores a serem calculados e depois é só pegar os resultados.
Estamos estudando a migração do sistema para Java, vamos continuar usando essa DLL até que se tenha tempo e dimdim pra migrar toda o código.
Com JNI eu consigo acessar objetos Java e seus atributos,mas acho que ainda assim é por valor.
Vejam nesse código :
JNIEXPORT void JNICALL Java_com_Exemplo_metodo(JNIEnv *env, jobject obj_this){
jclass class_Exemplo = (*env)->GetObjectClass(env,obj_this);
jfiedID id_atributoA = (*env)->GetFieldID(env,class_Exemplo,"atributoA","D");
jdouble atributoA = (*env)->GetDoubleField(env,obj_this,id_atributoA);
atributoA = atributoA * 2;
(*env)->SetDoubleField(env,obj_this,id_salario,salario);
Se para modificar uma variavel em uma classe java eu preciso usar o metodo SetXXXField isso cheira a passagem por valor. Na verdade só pode ser passagem por valor.
Na própria assinatura de um método JNI em C temos o parâmetro que referencia o ponteiro da estrutura JNIEnv, que faz referência ao endereço na memória a uma estrutura com as funções JNI da JVM. Isso é uma prova de que é possível utilizar passagem por referência entre Java e C.
Ta certo que é a própria implementação da JVM, é muito baixo nível, mas por mais baixo nível que seja, deve haver uma forma disponível para referenciar um endereço de memória.
....(JNIEnv *env,...
Eu vi em algum lugar que isso se faz utilizando-se arrays, mas ainda não encontrei nenhum material esclarecedor que falasse sobre isso.
alguém manja???