如何从ByteBuffer中获取short[]

11

我在一个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个回答

7

实际上,这种方法有点奇怪。您可以按照以下方式执行;将其排序对于将其转换为short数组非常重要。

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

此外,您可能需要使用allocateDirect而不是allocate

你能解释一下为什么要使用allocateDirect()吗?因为我在Android文档中没有找到任何提示。 - bei
这只是一种基于漏洞报告的预感。可能没有关系,但我认为值得一提。 - Cat

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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接