2012-08-13 12 views
6

Estoy usando código JNI en un proyecto de Android en el que la función nativa JNI requiere un argumento corto []. Sin embargo, los datos originales se almacenan como ByteBuffer. Estoy intentando convertir el formato de datos de la siguiente manera.¿Cómo puedo obtener corto [] de un ByteBuffer

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

Pero me encuentro con el siguiente problema cuando se ejecuta la segunda línea de código mostrado arriba

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

Podría alguien sugerir un medio para implementar la conversión?

Respuesta

5

El método hace esto es un poco extraño, en realidad. Puedes hacerlo como abajo; ordenar es importante convertirlo a una matriz short.

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

Además, puede que tenga que utilizar allocateDirect en lugar de allocate.

+0

Podría explicar un poco más por qué el uso allocateDirect()? Como no encuentro ninguna pista de la documentación de Android. – bei

+0

Es un presentimiento basado en [un informe de error] (http://code.google.com/p/android/issues/detail?id=24327) que se archivó. Puede no estar relacionado, pero pensé que valía la pena mencionarlo. – Eric

+0

Me sale el mismo error con esto. –

1

Tuve el mismo error con cualquier cosa que usara asShortBuffer(). Aquí hay una manera alrededor de ella (adaptado de 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); 
} 
Cuestiones relacionadas