2012-08-13 44 views
6

我在其中JNI本机函数需要短[]参数的Android项目中使用JNI代码。但是,原始数据存储为ByteBuffer。我试图按照以下方式转换数据格式。如何从ByteBuffer获得short []

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

任何人都可以建议执行转换的装置:

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

但是运行上面所示的第二行代码时,我会遇到以下问题?

回答

5

这个方法实际上有点奇怪。你可以这样做,如下所示;订购将其转换为short阵列非常重要。

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

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

+0

你能解释一点,为什么使用allocateDirect()?因为我没有从android文档中找到任何提示。 – bei 2012-08-13 08:54:38

+0

这是基于提交的[错误报告](http://code.google.com/p/android/issues/detail?id=24327)的预感。这可能是无关的,但我认为这值得一提。 – Eric 2012-08-13 18:06:34

+0

我收到与此相同的错误。 – 2014-10-10 12:08:25

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