我需要通过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
。我做错了什么以及如何实现我的需要?
答案 0 :(得分:1)
因为它是一个本机托管数组,所以你需要通过get函数访问它,比如getInt()
参见:https://groups.google.com/forum/#!topic/android-ndk/yNXuiQkGXPY
答案 1 :(得分:0)
您是否看过jbyteArray
或jintarray
?虽然我将byte[]
从java传递给c
也应该按照自己的方式工作,但是我使用它来处理原生端的YuV到RGB。