【发布时间】:2009-05-09 00:35:01
【问题描述】:
我有以下问题。我有 C 代码,它获取 PNG 图像作为基本的原始数据并将其保存在内存中。我希望通过使用 JNI 将这些原始数据转换为 Java 中的 BufferedImage。有谁知道这样做的方法或以前这样做过吗?
【问题讨论】:
标签: java java-native-interface bufferedimage
我有以下问题。我有 C 代码,它获取 PNG 图像作为基本的原始数据并将其保存在内存中。我希望通过使用 JNI 将这些原始数据转换为 Java 中的 BufferedImage。有谁知道这样做的方法或以前这样做过吗?
【问题讨论】:
标签: java java-native-interface bufferedimage
我假设您了解如何使用 JNI 调用函数的基础知识。这并不复杂,尽管它可能会让人头疼。
如果你想快速完成它,只需将 PNG 写入一个临时文件,通过 JNI 向上传递文件名并使用 ImageIO 加载它。
如果您想变得更复杂,并且避免需要文件路径,您可以在 ByteArrayInputStream 上使用 ImageIO.read(InputStream),该 ByteArrayInputStream 包装了您通过 JNI 传入的字节数组。你可以在C中调用NewByteArray(),然后使用SetByteArrayRegion来设置数据。
最后,您可以考虑使用 HTTP 传输数据,Apache has a set of components you can use 包含一个小型 Web 服务器,您可以从 C 代码 POST 到 Java。
【讨论】:
如果您以前从未使用过 JNI,我建议您查看 JNI Programmer's Guide and Specification。
总之,你要做的是:
native 关键字创建一个Java 方法,但没有实现。javah 来生成头文件(.h)。 javah 附带 JDK 安装。还有其他方法可以复制图像的原始数据,但我解释的这种方式应该足够了。
【讨论】:
由于 Java 库支持 PNG,我将添加一种机制,将所有字节从 C 复制到 Java,并按照Chad Okere 的建议使用 ImageIO 类。
另外,考虑使用 JNA 让生活更轻松 (example using JNA to draw a Windows cursor)。
【讨论】: