2012-08-13 14 views
6

Korzystam z kodu JNI w projekcie Android, w którym funkcja macierzysta JNI wymaga krótki argument []. Jednak oryginalne dane są przechowywane jako ByteBuffer. Próbuję przekonwertować format danych w następujący sposób.Jak mogę uzyskać krótkie [] z ByteBuffer

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

Ale napotkać następujący problem podczas uruchamiania drugą linię kodu przedstawionego powyżej:

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

Czy ktoś może zaproponować środki do realizacji konwersji?

Odpowiedz

5

Metoda ta jest nieco dziwna. Możesz to zrobić jak poniżej; przy zamawianiu ważne jest, aby przekształcić go w macierz short.

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

Dodatkowo, można użyć allocateDirect zamiast allocate.

+0

mógłbyś wyjaśnić nieco więcej, dlaczego używając allocateDirect()? Ponieważ nie znajduję żadnych wskazówek z dokumentacji Androida. – bei

+0

To przeczucie oparte na [zgłoszeniu błędu] (http://code.google.com/p/android/issues/detail?id=24327), które zostało zgłoszone. To może nie mieć związku, ale pomyślałem, że warto o tym wspomnieć. – Eric

+0

Otrzymuję ten sam błąd z tym. –

1

Miałem ten sam błąd z wszystkim, co użyłem asShortBuffer(). Oto sposób wokół niego (zaadaptowane z 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); 
}