Pessoal, como faço para enviar/ receber parâmetros por
referência utilizando o JNI?

Exemplo:

no Java envio :

char [] env = new char[128];

int rec = DLLTeste(env);

no C recebo:


DLLTeste(char *)
{
   .... 
}

Como eu faço para que consiga preencher minha variável
env? Sei que quando passo char[] a conversão em
C é char*, mas como devolvo o conteúdo como referência? Com passagem de
valor está funcionando tudo ok, já consegui fazer
funcionar um leitora de código de barras, mas
para receber os valores por referência estou tendo
problemas.

Já fiz a mesma coisa utilizando o J/Direct do J++,
mas como isso é Micro$oft e utilizei somente para
teste, agora só estou aproveitando as conversões
de tipo (Java/C), que tenho prontas.

A partir de outros exemplos que encontrei, consegui fazer o seguinte para utilizar referência:

Lado JAVA:

...
public native static int JFuncTeste(Object [][] s, int t);
private static Object [][] lS = new Object[128][0];
public static void main(String[] args) {
...
int recVal = JFuncTeste(lS,0);

System.out.println("oArry[0][0]= " + lS[0][0]);

Lado C:

JNIEXPORT jint JNICALL Java_Teste_JFuncTeste
(JNIEnv * env, jclass thisClazz, jobjectArray arr, jint x)
{
 char Buffer[128];
 int recLCB,j;

 jint sz = env->GetArrayLength(arr);

  recLCB = LeMinhaDLL(Buffer,x);

  jclass sclazz = env->FindClass("java/lang/String");

  jobjectArray sarr = env->NewObjectArray(sz, sclazz, NULL);

  env->SetObjectArrayElement(arr, x, sarr);

  jstring jstr = env->NewStringUTF(Buffer);

  jint el_sz = env->GetArrayLength(sarr);
  for (j = 0; j < el_sz; j++)
   env->SetObjectArrayElement(sarr, j, jstr);
 

   return recLCB;
}

Desta forma, consigo obter o conteúdo por referência, mas
gostaria de saber se existe uma maneira mais simplificada do
que utilizar matriz de matriz (simulação de matriz bi-dimensional
do Java).

Muito obrigado,

Renato.



Yahoo! Empregos
O trabalho dos seus sonhos pode estar aqui. Cadastre-se hoje mesmo no Yahoo! Empregos e tenha acesso a milhares de vagas abertas!

Responder a