【发布时间】:2011-12-17 13:35:43
【问题描述】:
我需要使用 ndk 在 C++ 中创建位图并将它们传递给 Java。我的意思不是复制,而是实际上将它们作为参数或返回值或其他类似的东西传递,因为复制它们太慢了。我还真的需要在 NDK 部分而不是在 java 中创建它们。
有人知道怎么做吗?
【问题讨论】:
我需要使用 ndk 在 C++ 中创建位图并将它们传递给 Java。我的意思不是复制,而是实际上将它们作为参数或返回值或其他类似的东西传递,因为复制它们太慢了。我还真的需要在 NDK 部分而不是在 java 中创建它们。
有人知道怎么做吗?
【问题讨论】:
正如 Peter Lawrey 已经指出的那样,使用非 Java 对象是不可能的,但是可以直接从简单的 Java 字节数组(可以在 C++ 端直接访问)绘制原始数据。
最后,您甚至可以使用此字节数组调用Canvas.drawBitmap(..) 来绘制您创建的图像。当然,这需要将图像直接以字节数组中所需的格式存储在 C++ 端。
Java:
byte[] pixelBuf = new byte[bufSize];
然后将byte[] 引用传递给本机C++ 实现。在 C++ 方面,您可以调用
C++:
jbyte* pixelBufPtr = env->GetByteArrayElements(pixelBuf, JNI_FALSE);
jsize pixelBufLen = env->GetArrayLength(env, pixelBuf);
// modify the data at pixelBufPtr with C++ functions
env->ReleaseByteArrayElements(pixelBuf, pixelBufPtr, 0);
【讨论】:
您可以尝试使用直接的 ByteBuffer。 ByteBuffer 指的是内存的本机区域。但是,要在 Java 中使用 Image,它必须位于 Java 对象中。您可以在 Java 或 C 中组装此对象,但我看不出如何避免复制图像,除非您的 C 库将图像写入 Java 结构。
【讨论】:
我遇到了同样的问题,我的解决方案是在 C++ 中分配巨大的缓冲区,然后将每个请求的“视图”绘制到 Java 位图中。我使用 Android 2.2 中出现的“新”NDK 位图功能;它们允许直接访问位图位。它可能不适合您的使用,但它确实避免了复制位图并允许您创建与可用内存一样大的位图。我创建了一个显示窗口大小的位图,然后使用我自己的本机代码缩放器从大位图中绘制缩放视图。
【讨论】: