ByteBuffer.allocateDirect(size)没有在Android 2.2模拟器中创建后备字节[]

时间:2012-12-20 19:06:04

标签: java android bytebuffer

我是android的新手。我似乎无法找到相关的论坛帖子。

让我感到困惑的是,allocateDirect() 确实在Android 4.2 模拟器中创建了支持字节[]。

更具体地说,我分配一个ByteBuffer,并多次调用buffer.put(byte[])来编写ByteBuffer的内容。然后我想交出后备字节[]进行压缩。它正在访问抛出UnsupportedOperationException的后备字节[]。

这是运行Android 2.2模拟器后写入的结果缓冲区内容:

enter image description here

这是运行Android 4.2模拟器后写入后的结果缓冲区内容:

enter image description here

差异似乎在于是否创建了bufferRef.block(它是在Android 4.2模拟器中分配ByteBuffer时创建的)。我宁愿总是使用直接的ByteBuffer。作为一种解决方法,我检查是否可以访问支持字节[],如果没有,则使用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 Build:v21.0.0-519525

Android 2.2模拟器配置:

根据Android 2.2,ARM(armeabi)处理器更新了AVD'AVD_for_Galaxy_Nexus_by_Google', [2012-12-20 10:09:34 - SDK Manager],具有以下硬件配置:

[2012-12-20 10:09:34 - SDK Manager] hw.sdCard = no

[2012-12-20 10:09:34 - SDK Manager] hw.device.manufacturer = Google

[2012-12-20 10:09:34 - SDK Manager] hw.mainKeys = no

[2012-12-20 10:09:34 - SDK Manager] hw.lcd.density = 320

[2012-12-20 10:09:34 - SDK Manager] hw.accelerometer = yes

[2012-12-20 10:09:34 - SDK Manager] hw.dPad = no

[2012-12-20 10:09:34 - SDK Manager] hw.device.hash = -708107041

[2012-12-20 10:09:34 - SDK Manager] hw.trackBall = no

[2012-12-20 10:09:34 - SDK Manager] hw.device.name = Galaxy Nexus

[2012-12-20 10:09:34 - SDK Manager] hw.camera.back = none

[2012-12-20 10:09:34 - SDK Manager] hw.sensors.proximity = yes

[2012-12-20 10:09:34 - SDK Manager] hw.battery = yes

[2012-12-20 10:09:34 - SDK Manager] disk.dataPartition.size = 200M

[2012-12-20 10:09:34 - SDK Manager] hw.audioInput = yes

[2012-12-20 10:09:34 - SDK Manager] hw.sensors.orientation = yes

[2012-12-20 10:09:34 - SDK Manager] hw.camera.front = none

[2012-12-20 10:09:34 - SDK Manager] hw.gps = yes

[2012-12-20 10:09:34 - SDK Manager] skin.dynamic = no

[2012-12-20 10:09:34 - SDK Manager] hw.keyboard = yes

[2012-12-20 10:09:34 - SDK Manager] vm.heapSize = 64

[2012-12-20 10:09:34 - SDK Manager] hw.ramSize = 512

2 个答案:

答案 0 :(得分:1)

更好的答案是.allocateDirect()不会创建支持数组。您必须调用ByteBuffer.get(byte[])来填充给定缓冲区中的数组。

答案 1 :(得分:0)

Android 2.2没有字节缓冲区。缓冲区是可选的。它是在以后的版本中实现的。