0

私はアンドロイドが初めてです。関連するフォーラムの投稿が見つからないようです。

私が困惑したのはallocateDirect() 、 Android 4.2エミュレーター でバッキング byte[] を作成することです。

具体的には、ByteBuffer を割り当て、buffer.put(byte[])何回か呼び出して ByteBuffer の内容を書き込みます。次に、圧縮のためにバッキング byte[] を渡したいと思います。UnsupportedOperationException をスローするバッキング byte[] にアクセスしています。

Android 2.2 エミュレーターの実行時に書き込みを行った直後のバッファーの内容は次のとおりです。

ここに画像の説明を入力

Android 4.2 エミュレーターの実行時に書き込みを行った直後のバッファーの内容は次のとおりです。

ここに画像の説明を入力

違いは、bufferRef.block作成されるかどうかのようです (Android 4.2 エミュレーターで ByteBuffer が割り当てられたときに作成されます)。私は常に直接 ByteBuffer を使用したいと思います。回避策として、バッキング byte[] にアクセスできるかどうかを確認し、アクセスできない場合は を使用して再割り当てしByteBuffer.allocate(size)ます。

        ByteBuffer buf;
        try {
            buf = ByteBuffer.allocateDirect(this.maxBufferSize);
            if(!buf.hasArray()) { //some API levels either don't expose or create the backing byte[]  
                buf = null;
                buf = ByteBuffer.allocate(this.maxBufferSize);
            }
        } catch (Exception e) {
            return false;
        }

それで、私の質問は、ダイレクトバイトバッファが常にバッキングバイト[]を持つことを保証する方法はありますか(十分なメモリがあると仮定して)?または、この回避策を使用する必要がありますか?

環境:

ADT ビルド: v21.0.0-519525

Android 2.2 エミュレータ構成:

Android 2.2、ARM (armeabi) プロセッサ、[2012-12-20 10:09:34 - SDK Manager] に基づく AVD 'AVD_for_Galaxy_Nexus_by_Google' を次のハードウェア構成で更新しました。

[2012-12-20 10:09:34 - SDK マネージャー] hw.sdCard=いいえ

[2012-12-20 10:09:34 - SDK マネージャー] hw.device.manufacturer=Google

[2012-12-20 10:09:34 - SDK マネージャー] hw.mainKeys=いいえ

[2012-12-20 10:09:34 - SDK マネージャー] hw.lcd.density=320

[2012-12-20 10:09:34 - SDK マネージャー] hw.accelerometer=yes

[2012-12-20 10:09:34 - SDK マネージャー] hw.dPad=いいえ

[2012-12-20 10:09:34 - SDK マネージャー] hw.device.hash=-708107041

[2012-12-20 10:09:34 - SDK マネージャー] hw.trackBall=no

[2012-12-20 10:09:34 - SDK マネージャー] hw.device.name=Galaxy Nexus

[2012-12-20 10:09:34 - SDK マネージャー] hw.camera.back=none

[2012-12-20 10:09:34 - SDK マネージャー] hw.sensors.proximity=yes

[2012-12-20 10:09:34 - SDK マネージャー] hw.battery=yes

[2012-12-20 10:09:34 - SDK マネージャー] disk.dataPartition.size=200M

[2012-12-20 10:09:34 - SDK マネージャー] hw.audioInput=yes

[2012-12-20 10:09:34 - SDK マネージャー] hw.sensors.orientation=yes

[2012-12-20 10:09:34 - SDK マネージャー] hw.camera.front=none

[2012-12-20 10:09:34 - SDK マネージャー] hw.gps=yes

[2012-12-20 10:09:34 - SDK マネージャー] skin.dynamic=no

[2012-12-20 10:09:34 - SDK マネージャー] hw.keyboard=yes

[2012-12-20 10:09:34 - SDK マネージャー] vm.heapSize=64

[2012-12-20 10:09:34 - SDK マネージャー] hw.ramSize=512

4

2 に答える 2

1

より良い答えは.allocateDirect()、バッキング アレイを作成しないことです。ByteBuffer.get(byte[])指定されたバッファから配列を設定するには、 を呼び出す必要があります。

于 2013-04-17T21:01:24.410 に答える
0

Android 2.2 のバイト バッファはありません。バッファはオプションです。これは、後のリリースで実装されました。

于 2013-02-02T05:14:17.713 に答える