Problema com JNI

3 respostas
U

Pessoal, alguém sabe o que estou fazendo errado?? Quero chamar uma função da dll que recebe como parâmetros um vetor de bytes, x, y e retorna como referência o vetor bufferRet que estou declarando na função).

JNIEXPORT jbyteArray JNICALL Java_ClassePrincipal_Marcar (JNIEnv *env, jobject obj, jbyteArray buffer, jint x, jint y)
{
        jclass cls       = env->GetObjectClass(obj);
        jbyte * vals   = env->GetByteArrayElements(buffer,0);
        char  *bufferRet = new char[1024*1024];
        Marcar(vals, x, y, bufferRet);        
        return (jbyteArray)bufferRet;
}

O problema é que o bufferRet não é o vetor 1024*1024 que eu esperava, um NullPointerException ocorre quando tento acessá-lo. Alguém sabe a possivel causa disso?

3 Respostas

E

Para alocar um array de bytes para ser lido no Java, não adianta fazer um cast. Não se esqueça: cast não funciona nesse caso.

Veja aqui ( http://java.sun.com/developer/onlineTraining/Programming/JDCBook/jniexamp.html ) um exemplo de como alocar um byte array para o Java poder entender.

U

Bem, após dar uma olhada nesse link modifiquei a função, estou passando um buffer de byte com valores 255 em todas as posições (uma imagem em branco 1024x1024).

A função JNI esta assim:

JNIEXPORT jbyteArray JNICALL Java_ClassePrincipal_Marcar (JNIEnv *env, jobject obj)
{  
   BYTE  * bufferR  = new BYTE [1024*1024];         
   Marcar( (char *)bufferR);//chamada à função da DLL
   //Se eu iterar no bufferR neste ponto consigo mostrar os valores corretos do buffer (255)
   jbyteArray bufferRet = env->NewByteArray(1024*1024);
   env->SetByteArrayRegion(bufferRet, 0, 1024*1024,bufferR);      
   delete bufferR;
   return bufferRet;
}

e na classe Java atribuo da seguinte forma:

byte[] vetByte = new byte[1024*1024];
vetByte = imagem.Marcar();
for (int i=0; i<1024*1024; i++)
   if(i%1024 == 0)
      System.out.println(vetByte[i]);
//Se eu iterar no vetBuffer neste ponto NÃO consigo mostrar os valores corretos do vetor.
//O resultado é sempre -1 para todas as posições amostradas.

Não sei o que ainda estou fazendo de errado p0ara retornar o vetor de bytes para o Java.

U

Funcionando:

JNIEXPORT jbyteArray JNICALL Java_ClassePrincipal_Marcar (JNIEnv *env, jobject obj, jbyteArray buffer, jint x, jint y)  
{ 
        jclass cls = env->GetObjectClass(obj);
        jbyte * vals = env->GetByteArrayElements(buffer,0);
        BYTE  * bufferR  = new BYTE [x*y];
        Marcar(x, y, (char *)bufferR);
        jbyteArray bufferRet = env->NewByteArray(x*y);
        env->SetByteArrayRegion(bufferRet, 0, x*y,(jbyte *)bufferR);
        
        delete bufferR;
        return bufferRet;
}

obrigado pela dica entanglement

Criado 3 de janeiro de 2011
Ultima resposta 4 de jan. de 2011
Respostas 3
Participantes 2