Frage

ich habe folgendes Problem. Ich habe C-Code, der ein PNG-Bild als im Grunde Rohdaten erfaßt und hält sie im Speicher. Ich möchte diese Rohdaten zu einem BufferedImage in Java übersetzt werden, durch die Verwendung von JNI. Kennt jemand eine Möglichkeit, dies zu tun, oder hat das schon mal gemacht?

War es hilfreich?

Lösung

Ich nehme an, Sie kennen die Grundlagen, wie Funktionen mit JNI aufrufen. Es ist nicht so kompliziert, obwohl es ein Schmerz im Arsch sein kann.

Wenn Sie wollen, dass es schnell zu erledigen, schreiben Sie einfach den PNG in eine temporäre Datei, den Dateinamen oben durch JNI geben und laden Sie es ImageIO verwendet wird.

Wenn Sie anspruchsvollere erhalten möchten, und vermeiden Sie einen Dateipfad benötigen, können Sie ImageIO.read (Inputstream) auf ByteArrayInputStream , dass Sie ein Byte-Array in über JNI passieren wickelt. Sie können NewByteArray () von C und verwenden Sie dann SetByteArrayRegion , um die Daten zu setzen.

Schließlich könnten Sie HTTP unter Verwendung der Daten zu übertragen, Apache hat eine Reihe von Komponenten, die Sie verwenden können, , die ein wenig Web-Server gehören, können Sie von Ihrem C-Code zu Java veröffentlichen.

Andere Tipps

Wenn Sie noch nie JNI verwendet haben, würde ich Ihnen empfehlen, einen Blick auf die JNI Programmierhandbuch und Spezifikation .

zusammenfassend, was Sie tun müssen, ist:

  1. erstellen eine Java-Methode mit dem native Schlüsselwort, ohne Umsetzung.
  2. verwenden Sie den Befehl javah auf die Klasse mit der nativen Methode eine Headerdatei (.h) zu erzeugen. javah kommt mit einer JDK-Installation.
  3. implementieren Ihre native Java-Funktion in C / C ++.
    1. Suchen Sie die Klasse java.awt.image.BufferedImage.
    2. Suchen Sie den Konstruktor Sie verwenden möchten.
    3. erstellen BufferedImage Objekt mit dem angegebenen Konstruktor.
    4. -Suche setPixel Methode.
    5. diese Methode läuft jeden Pixelwert in Ihrem Bild zu setzen. Sie werden es brauchen laufen Höhe x Breite mal.
    6. Rückkehr auf das Objekt.
  4. kompilieren Ihre nativen Datei in eine gemeinsam genutzte Bibliothek.
  5. laden Sie Ihre gemeinsam genutzte Bibliothek in Ihrer Java-Klasse.
  6. führen Sie Ihre Java-Klasse angibt, Ihre gemeinsame Bibliothek zu verknüpfen.

es gibt auch andere Möglichkeiten, um die Rohdaten des Bildes kopieren, aber auf diese Weise erklärte ich sollte genug sein.

Da die Java-Bibliothek PNG unterstützt, würde ich einen Mechanismus hinzuzufügen, die alle Bytes von C nach Java kopiert und verwenden Sie die ImageIO Klasse: Chad Okere vermuten läßt.

Auch betrachtet JNA mit Leben leichter ( Beispiel mit JNA machen ziehen Windows Cursor ).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top