2012-08-13 22 views
6

Ich benutze JNI-Code in einem Android-Projekt, in dem die JNI native Funktion ein kurzes [] Argument benötigt. Die ursprünglichen Daten werden jedoch als ByteBuffer gespeichert. Ich versuche das Datenformat wie folgt zu konvertieren.Wie bekomme ich kurz [] von einem ByteBuffer

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

Aber ich begegnen folgendes Problem, wenn die zweite Codezeile ausgeführt wird oben gezeigt:

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

Könnte jemand ein Mittel vorschlagen, um die Umwandlung zu implementieren?

Antwort

5

Die Methode ist dies ein bisschen seltsam, eigentlich. Sie können es wie folgt tun; Bestellung ist es wichtig, es zu einem short Array zu konvertieren.

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

Zusätzlich können Sie allocateDirect statt allocate verwenden.

+0

Könnten Sie ein bisschen mehr erklären, warum allocateDirect() verwenden? Da finde ich keine Hinweise aus der Android-Dokumentation. – bei

+0

Es ist eine Ahnung basierend auf [einem Fehlerbericht] (http://code.google.com/p/android/issues/detail?id=24327), der eingereicht wurde. Es mag nicht verwandt sein, aber ich fand es erwähnenswert. – Eric

+0

Ich bekomme den gleichen Fehler damit. –

1

Ich hatte den gleichen Fehler mit allem, asShortBuffer() verwendet. Hier ist ein Weg, um sie (angepasst von 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); 
}