私はアンドロイドが初めてです。関連するフォーラムの投稿が見つからないようです。
私が困惑したのは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