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

有帮助吗?

解决方案

我假设您了解如何使用 JNI 调用函数的基础知识。事情并没有那么复杂,尽管可能会很麻烦。

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

如果您想变得更复杂,并且避免需要文件路径,您可以使用 ImageIO.read(输入流) 在一个 字节数组输入流 它包装了您通过 JNI 传入的字节数组。您可以致电 新字节数组() 从 C 然后使用 设置字节数组区域 设置数据。

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

其他提示

如果你从来没有使用JNI之前,我建议你看看 JNI程序的指导和说明书.

总之,你有什么要做的是:

  1. 创建一个Java方法 native 关键词,与没有实现。
  2. 使用的命令 javah 在这类地方法产生的一标题的文件(.h)。 javah 配有JAVA安装。
  3. 实现你的母Java功能在C/C++。
    1. 搜索类java。awt.图像。BufferedImage.
    2. 搜索的构造你想要使用。
    3. 创建一个BufferedImage目的指定的构造。
    4. 搜索setPixel方法。
    5. 运行的方法来设定各像素的价值,在你的形象。你会需要运行它 高度 x 倍。
    6. 返回的对象。
  4. 编译是你的母文件纳入一个共用图书馆。
  5. 负载的共享图书馆内部Java类。
  6. 运行Java类的指示,联你共用图书馆。

还有其他方法复制的原始数据的图像,但是这种方式我解释应该是足够的。

由于 Java 库支持 PNG,我将添加一种机制,将所有字节从 C 复制到 Java 并使用 ImageIO 类作为 查德·奥克雷 建议。

另外,考虑使用 JNA 让生活更轻松(使用 JNA 绘制 Windows 光标的示例).

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top