我有以下问题。我有 C 代码,它获取 PNG 图像作为基本的原始数据并将其保存在内存中。我希望通过使用 JNI 将这些原始数据转换为 Java 中的 BufferedImage。有没有人知道这样做的任何方式或以前这样做过?
问问题
4905 次
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。
总之,你要做的是:
- 用关键字创建一个 Java 方法
native
,没有实现。 - 使用
javah
带有本机方法的类上的命令来生成头文件(.h)。javah
附带JDK安装。 - 在 C/C++ 中实现您的本机 Java 函数。
- 搜索类 java.awt.image.BufferedImage。
- 搜索您要使用的构造函数。
- 使用指定的构造函数创建一个 BufferedImage 对象。
- 搜索 setPixel 方法。
- 运行该方法来设置图像中的每个像素值。您需要运行它的高度x宽度次。
- 返回对象。
- 将您的本机文件编译到共享库中。
- 在您的 Java 类中加载您的共享库。
- 运行您的 Java 类,指示链接您的共享库。
还有其他方法可以复制图像的原始数据,但我解释的这种方式就足够了。
于 2009-05-09T06:50:12.813 回答
0
由于 Java 库支持 PNG,我将添加一种机制,将所有字节从 C 复制到 Java,并按照Chad Okere的建议使用 ImageIO 类。
此外,考虑使用 JNA 让生活更轻松(例如使用 JNA 绘制 Windows 光标)。
于 2009-05-09T11:06:43.163 回答