Pergunta

Eu tenho o seguinte problema. Eu tenho o código C que adquire uma imagem PNG como dados, basicamente, matérias e mantém-lo na memória. Gostaria que esta dados em bruto a ser traduzido a um BufferedImage em Java, através do uso de JNI. Alguém sabe alguma maneira de fazer isso ou que tenha feito isso antes?

Foi útil?

Solução

Eu vou assumir que você sabe o básico de como chamar funções com JNI. Não é tão complicado, embora possa ser um pé no saco.

Se você quiser fazê-lo rapidamente, basta escrever o PNG para um arquivo temporário, passar o nome do arquivo através JNI e carregá-lo usando ImageIO.

Se você quiser obter mais sofisticado, e evitar a necessidade de um caminho de arquivo, você pode usar ImageIO.read (InputStream) em uma ByteArrayInputStream que envolve uma matriz de bytes que você passa através JNI. Você pode chamar NewByteArray () partir de C e depois usar SetByteArrayRegion para definir os dados.

Finalmente, você pode considerar o uso de HTTP para transferir os dados, Apache tem um conjunto de componentes que você pode usar que incluem um servidor web pouco, você pode postar em seu código C para Java.

Outras dicas

Se você nunca usou JNI antes, eu recomendo que você dê uma olhada no Guia e Especificação da JNI programador .

Em resumo, o que você tem a fazer é:

  1. criar um método Java com a palavra chave native, sem implementação.
  2. usar o javah comando na classe com o método nativo para gerar um arquivo de cabeçalho (.h). javah vem com uma instalação JDK.
  3. implementar sua função Java nativa em C / C ++.
    1. procurar o java.awt.image.BufferedImage classe.
    2. procurar o construtor que deseja usar.
    3. criar um objeto BufferedImage com o construtor especificado.
    4. procurar o método setPixel.
    5. executar esse método para definir cada valor de pixel da imagem. você precisa executá-lo altura x largura vezes.
    6. retornar o objeto.
  4. compilar seu arquivo nativo em uma biblioteca compartilhada.
  5. carregar a sua biblioteca compartilhada dentro de sua classe Java.
  6. executar sua classe Java indicando, ligando sua biblioteca compartilhada.

existem outras maneiras de copiar os dados brutos de sua imagem, mas desta forma eu expliquei deve ser suficiente.

Uma vez que a biblioteca Java suporta PNG, gostaria de acrescentar um mecanismo que copiou todos os bytes de C para Java e usar a classe ImageIO como Chad Okere sugere.

Além disso, considere o uso JNA para tornar a vida mais fácil ( usando JNA para desenhar um Windows cursor ).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top