JNI (problema com PNG)

5 respostas
J

Olá pessoal.

Estou desenvolvendo um método em JNI que vai me retorna uma imagem para a aplicação java.

O cógido abaixo mostra o que foi feito até o momento, mas não esta me retornando a imagem por completo.

Estou achando que é por causa da transformação que está sendo feita de "char * " para " jstring ".

O único retorno que estou tendo com essa transformação é do cabeçalho do PNG.

JNIEXPORT jstring JNICALL Java_TerraJava_getPng
(JNIEnv *env, jclass TeJava){

	if(TeWeb == NULL)
	    return NULL;

	int imageSize = 0;
   	char *buff = (char*)(TeWeb->getPlotPtr(imageSize));

	jstring jbuff = (*env).NewStringUTF(buff);
	TeWeb->freeImage((void*)buff); 
	return jbuff;
}

Valeu
Junior Bruno

5 Respostas

T

Mude o tipo de retorno de sua função Java para byte[]. Além disso, não use NewStringUTF. Use a função do JNI adequada para alocar arrays de bytes.

É que a tal função que você quer chamar (NewStringUTF) está parando no primeiro zero binário que ela está encontrando, ou seja, um pouquinho depois do cabeçalho PNG.

Não confunda Strings do Java com char *, são coisas distintas. A primeira lida com caracteres Unicode; a segunda com bytes.

J

Valeu Thiago
Deu certo.
Agora eu estou precisando imprimir esse byte[] no navegador.

Eu estou utilizando o PrintWriter out = response.getWriter();

Na API não tem nada falando de byte[].

Como faço para colcoar essa imagem (byte[]) no navegador??

Junior Bruno

T

Não é para usar o PrintWriter (que serve só para HTML) e sim alguma OutputStream (que serve para dados binários). Cheque na sua documentação como obter o OutputStream (para você usar o método “write”, que aceita um array de byte.) Deve ser algo parecido com request.getOutputStream ou coisa parecida, nunca sei essas coisas de cor.

J

Não estou conseguindo

Poderia me passar um exemplo??

Valeu

Junior Bruno

J

Para o conhecimento de todos olhem o que eu fiz para solucionar o problema do JNI.

JNIEXPORT jbyteArray JNICALL Java_TerraJava_getPng
(JNIEnv *env, jclass TeJava){

	if(TeWeb == NULL)
	    return NULL;

	int imageSize = 0;
   	char *buff = (char*)(TeWeb->getPlotPtr(imageSize));
	
	jbyteArray j_array = env->NewByteArray(imageSize);
	(*env).SetByteArrayRegion(j_array, 0, imageSize, (jbyte *)buff);

	return	j_array;
}
Criado 12 de setembro de 2006
Ultima resposta 13 de set. de 2006
Respostas 5
Participantes 2