Как я могу получить короткий из ByteBuffer

Я использую код 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) 

Может ли кто-нибудь предложить средство для осуществления преобразования?

Метод делает это немного странно, на самом деле. Вы можете сделать это, как показано ниже; При заказе важно преобразовать его в short массив.

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

Кроме того, вам может потребоваться использовать allocateDirect вместо allocate .

У меня была такая же ошибка с чем-то, что использовалось 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); }