Domanda

Ho il seguente problema. Ho un codice C che acquisisce un'immagine PNG come dati sostanzialmente grezzi e li mantiene in memoria. Vorrei che questi dati grezzi fossero tradotti in un'immagine bufferizzata in Java, attraverso l'uso di JNI. Qualcuno sa come farlo o l'ha già fatto prima?

È stato utile?

Soluzione

Presumo che tu conosca le basi di come chiamare le funzioni con JNI. Non è così complicato, anche se può essere un dolore nel culo.

Se vuoi farlo rapidamente, scrivi semplicemente il PNG in un file temporaneo, passa il nome del file tramite JNI e caricalo usando ImageIO.

Se vuoi diventare più sofisticato ed evitare di aver bisogno di un percorso di file, puoi usare ImageIO.read (InputStream) su un ByteArrayInputStream che avvolge un array di byte che passi attraverso JNI. Puoi chiamare NewByteArray () da C e quindi utilizzare SetByteArrayRegion per impostare i dati.

Infine, potresti considerare l'utilizzo di HTTP per trasferire i dati, Apache ha una serie di componenti che puoi usare che includono un piccolo server Web, puoi POSTARE dal tuo codice C a Java.

Altri suggerimenti

se non hai mai usato JNI prima, ti consiglio di dare un'occhiata a Guida e specifiche del programmatore JNI .

in sintesi, quello che devi fare è:

  1. crea un metodo Java con la native parola chiave, senza implementazione.
  2. usa il comando javah sulla classe con il metodo nativo per generare un file header (.h). <=> viene fornito con un'installazione JDK.
  3. implementa la tua funzione Java nativa in C / C ++.
    1. cerca nella classe java.awt.image.BufferedImage.
    2. cerca il costruttore che vuoi usare.
    3. crea un oggetto BufferedImage con il costruttore specificato.
    4. cerca il metodo setPixel.
    5. esegui quel metodo per impostare ciascun valore di pixel nell'immagine. dovrai eseguirlo altezza x larghezza volte.
    6. restituisce l'oggetto.
  4. compila il tuo file nativo in una libreria condivisa.
  5. carica la tua libreria condivisa all'interno della tua classe Java.
  6. esegui la tua classe Java indicando, collegando la tua libreria condivisa.

ci sono altri modi per copiare i dati grezzi della tua immagine, ma in questo modo ho spiegato dovrebbe essere sufficiente.

Poiché la libreria Java supporta PNG, aggiungerei un meccanismo che copiava tutti i byte da C a Java e utilizzava la classe ImageIO come suggerisce Chad Okere .

Inoltre, considera l'utilizzo di JNA per semplificarti la vita ( esempio usando JNA per disegnare un cursore di Windows ).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top