0

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

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

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

这是运行 Android 2.2 模拟器时写入后生成的缓冲区内容:

在此处输入图像描述

这是运行 Android 4.2 模拟器时写入后生成的缓冲区内容:

在此处输入图像描述

区别似乎在于是否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 版本: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 管理器] hw.sdCard=no

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

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

[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=no

[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 回答