2012-08-13 12 views
6

Sto utilizzando il codice JNI in un progetto Android in cui la funzione nativa JNI richiede un argomento breve []. Tuttavia, i dati originali vengono memorizzati come ByteBuffer. Sto provando a convertire il formato dei dati come segue.Come posso ottenere un abbreviazione [] da un ByteBuffer

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

Ma ho incontrato il seguente problema quando si esegue la seconda riga di codice mostrato sopra:

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

qualcuno potrebbe suggerire un mezzo per realizzare la conversione?

risposta

5

Questo metodo è un po 'strano, in realtà. Puoi farlo come di seguito; ordinando è importante convertirlo in un array short.

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

Inoltre, potrebbe essere necessario utilizzare allocateDirect invece di allocate.

+0

Potrebbe spiegare un po 'di più perché l'utilizzo di allocateDirect()? Dal momento che non trovo alcun suggerimento dalla documentazione di Android. – bei

+0

È un'intuizione basata su [un bug report] (http://code.google.com/p/android/issues/detail?id=24327) che è stato archiviato. Potrebbe non essere correlato, ma ho pensato che fosse degno di nota. – Eric

+0

Ho lo stesso errore con questo. –

1

Ho avuto lo stesso errore con qualsiasi cosa che utilizzava asShortBuffer(). Ecco un modo intorno ad esso (adattato da 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); 
} 
Problemi correlati