如何从ByteBuffer获得short []

时间:2012-08-13 08:12:59

标签: android bytebuffer

我在Android项目中使用JNI代码,其中JNI本机函数需要short []参数。但是,原始数据存储为ByteBuffer。我正在尝试转换数据格式如下。

ByteBuffer rgbBuf = ByteBuffer.allocate(size);
...    
short[] shortArray = (short[]) rgbBuf.asShortBuffer().array().clone();

但是在运行上面显示的第二行代码时遇到以下问题:

E/AndroidRuntime(23923): Caused by: java.lang.UnsupportedOperationException
E/AndroidRuntime(23923): at Java.nio.ShortToByteBufferAdapter.protectedArray(ShortToByteBufferAdapter.java:169)

有人可以提出实施转换的方法吗?

2 个答案:

答案 0 :(得分:5)

实际上这个方法有点奇怪。你可以这样做;订购它很重要,将其转换为short数组。

short[] shortArray = new short[size/2];
rgbBuf.order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get(shortArray);

此外,您可能必须使用allocateDirect代替allocate

答案 1 :(得分:1)

我对使用asShortBuffer()的任何内容都有同样的错误。这是一种解决方法(改编自2 bytes to short java):

short[] shortArray = new short[rgbBuf.capacity() / 2]);
for (int i=0; i<shortArray.length; i++)
{   
    ByteBuffer bb = ByteBuffer.allocate(2);
    bb.order(ByteOrder.LITTLE_ENDIAN);
    bb.put(rgbBuf[2*i]);
    bb.put(rgbBuf[2*i + 1]);
    shortArray[i] = bb.getShort(0);
}