Java 如何使用direct ByteBuffer
我需要通过JNI将数据缓冲区从Java 如何使用direct ByteBuffer,java,android,c,java-native-interface,Java,Android,C,Java Native Interface,我需要通过JNI将数据缓冲区从C传递到Java。因此,我们在C中创建了一个直接ByteBuffer,并将其发送到Java: void *myBuffer = ...; int w = ..., h = ...; jmethodID func = ...; jobject directBuffer = jni_env->NewDirectByteBuffer(myBuffer, w * h); jni_env->CallVoidMethod(myActivity, func, dir
C
传递到Java
。因此,我们在C
中创建了一个直接ByteBuffer
,并将其发送到Java
:
void *myBuffer = ...;
int w = ..., h = ...;
jmethodID func = ...;
jobject directBuffer = jni_env->NewDirectByteBuffer(myBuffer, w * h);
jni_env->CallVoidMethod(myActivity, func, directBuffer, w, h);
在Java
端,我成功地收到了那个缓冲区,但我不能使用它
public static final void Func(final java.nio.ByteBuffer pixels, int w, int h) {
boolean ok = pixels.hasArray();
if (ok)
{
java.nio.IntBuffer i_pixels = pixels.asIntBuffer();
final int[] apixels = i_pixels.array();
Bitmap bm = Bitmap.createBitmap(apixels, w, h, Bitmap.Config.ARGB_8888);
}
// ...
}
第一行(boolean ok=pixels.hasArray();
)与UnsupportedOperationException
一起崩溃
如您所见,我需要将接收到的缓冲区转换为
int[]
,以便将其传递到Bitmap.createBitmap
。我做错了什么以及如何实现我需要的?因为它是本机托管阵列,所以需要通过get函数(如getInt())访问它
请参阅:您是否看过
jbyteraray
或jintarray
?我使用它在本机端将YuV处理为RGB,尽管我正在将字节[]
从java传递到c
也应该按您的方式进行。显示此位:jmethodID func=代码>还解释“在Java端,我成功地收到了该缓冲区”您是如何知道的?@weston Debugger为我显示了像素的正确缓冲区大小。w
和h
的值也是正确的。func=…
没有问题。即使直接字节缓冲区有数组,也不能断定asIntBuffer()的结果有数组。注意:没有像DirectByteBuffer这样的类。
谢谢。但是如果我调用getInt
来获取一百万像素,而不是将它们作为数组传递,那么性能就会受到影响。在我的情况下,DirectByteBuffer
似乎毫无意义。那么,您知道没有这种开销的C
->Java
传递数据的其他方法吗?@Nick您是否尝试过通过NewIntArray
&SetIntArrayRegion
分配本机intArray?这将使阵列的内存使用率翻倍,但它的寿命很短。是的,我正在尝试。似乎我有一个悲哀的选择,要么处理速度慢(使用DirectByteBuffer
),要么内存开销大(通过SetIntArrayRegion
)。。。无论如何,我接受你的回答,非常感谢。