如何使用直接ByteBuffer

时间:2014-10-13 12:49:24

标签: java android c java-native-interface

我需要通过JNI将数据缓冲区从C传递到Java。因此,在ByteBuffer中创建了直接C并将其发送到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。我做错了什么以及如何实现我的需要?

2 个答案:

答案 0 :(得分:1)

因为它是一个本机托管数组,所以你需要通过get函数访问它,比如getInt()

参见:https://groups.google.com/forum/#!topic/android-ndk/yNXuiQkGXPY

答案 1 :(得分:0)

您是否看过jbyteArrayjintarray?虽然我将byte[]从java传递给c也应该按照自己的方式工作,但是我使用它来处理原生端的YuV到RGB。