2

我有以下问题。我有 C 代码,它获取 PNG 图像作为基本的原始数据并将其保存在内存中。我希望通过使用 JNI 将这些原始数据转换为 Java 中的 BufferedImage。有没有人知道这样做的任何方式或以前这样做过?

4

3 回答 3

5

我假设您知道如何使用 JNI 调用函数的基础知识。这并不复杂,尽管它可能会让人头疼。

如果你想快速完成它,只需将 PNG 写入一个临时文件,通过 JNI 传递文件名并使用 ImageIO 加载它。

如果你想变得更复杂,并且避免需要文件路径,你可以在ByteArrayInputStream上使用ImageIO.read(InputStream) ,它包装你通过 JNI 传入的字节数组。您可以从 C 中调用NewByteArray(),然后使用SetByteArrayRegion设置数据。

最后,您可能会考虑使用 HTTP 来传输数据,Apache有一组您可以使用的组件,其中包括一个小型 Web 服务器,您可以从 C 代码 POST 到 Java。

于 2009-05-09T07:48:02.487 回答
1

如果您以前从未使用过 JNI,我建议您查看JNI Programmer's Guide and Specification

总之,你要做的是:

  1. 用关键字创建一个 Java 方法native,没有实现。
  2. 使用javah带有本机方法的类上的命令来生成头文件(.h)。javah附带JDK安装。
  3. 在 C/C++ 中实现您的本机 Java 函数。
    1. 搜索类 java.awt.image.BufferedImage。
    2. 搜索您要使用的构造函数。
    3. 使用指定的构造函数创建一个 BufferedImage 对象。
    4. 搜索 setPixel 方法。
    5. 运行该方法来设置图像中的每个像素值。您需要运行它的高度x宽度次。
    6. 返回对象。
  4. 将您的本机文件编译到共享库中。
  5. 在您的 Java 类中加载您的共享库。
  6. 运行您的 Java 类,指示链接您的共享库。

还有其他方法可以复制图像的原始数据,但我解释的这种方式就足够了。

于 2009-05-09T06:50:12.813 回答
0

由于 Java 库支持 PNG,我将添加一种机制,将所有字节从 C 复制到 Java,并按照Chad Okere的建议使用 ImageIO 类。

此外,考虑使用 JNA 让生活更轻松(例如使用 JNA 绘制 Windows 光标)。

于 2009-05-09T11:06:43.163 回答