2012-08-13 9 views
6

JNIネイティブ関数がshort []引数を必要とするAndroidプロジェクトでJNIコードを使用しています。ただし、元のデータはByteBufferとして格納されます。私は次のようにデータ形式を変換しようとしています。ByteBufferからshort []を取得する方法

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

しかし、上記のコードの2行目の実行時に、私は次のような問題が発生します。

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

を誰もが、変換を実装するための手段を提案してもらえますか?

答えて

5

この方法は実際には少し奇妙です。あなたは以下のようにすることができます。配列をshort配列に変換することが重要です。

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

また、あなたはallocateDirectの代わりallocateを使用する必要があります。

+0

もう少し詳しくallocateDirect()を使って説明できますか?以来、私はアンドロイドのドキュメントからのヒントは見つかりません。 – bei

+0

提出された[バグレポート](http://code.google.com/p/android/issues/detail?id=24327)に基づいた勘違いです。それは無関係かもしれないが、私はそれが言及する価値があると思った。 – Eric

+0

これで同じエラーが発生します。 –

1

私はasShortBuffer()を使ったものと同じエラーがありました。その周辺の方法は(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); 
} 
関連する問題