11

我在一个 JNI 本机函数需要一个短 [] 参数的 Android 项目中使用 JNI 代码。但是,原始数据存储为 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)

任何人都可以提出一种实现转换的方法吗?

4

2 回答 2

7

实际上,这样做的方法有点奇怪。您可以按以下方式进行;排序将其转换为short数组很重要。

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

此外,您可能必须使用allocateDirect而不是allocate.

于 2012-08-13T08:16:36.323 回答
1

我对任何使用过的东西都有同样的错误asShortBuffer()。这是一种解决方法(从2 个字节改编为短 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);
}
于 2014-10-10T12:13:03.253 回答