Java 如何使用direct ByteBuffer

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

我需要通过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, 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
)。。。无论如何,我接受你的回答,非常感谢。