11

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

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)

誰かが変換を実装する手段を提案できますか?

4

2 に答える 2

7

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

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

さらに、allocateDirect代わりにallocate.

于 2012-08-13T08:16:36.323 に答える
1

を使用したもので同じエラーが発生しましたasShortBuffer()。これを回避する方法は次のとおりです(2バイトから短い 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);
}
于 2014-10-10T12:13:03.253 に答える