【发布时间】:2018-05-29 06:54:35
【问题描述】:
我的代码是:
if (frameRGBABuffer == null) {
frameRGBABuffer = ByteBuffer.allocateDirect(cameraHeight * cameraWidth * 4)
.order(ByteOrder.nativeOrder());
}
Log.d("tag",frameRGBABuffer.array().length)
我的相机分辨率是 1280×720,因此frameRGBABuffer 应该分配 3686400 字节的空间。
但奇怪的是frameRGBABuffer.array()的长度是3686407,为什么多了7个字节的空格?
顺便说一句,frameRGBABuffer.array() 不抛出异常,返回一个带数据的 byte[]
Android 似乎分配了 7 个额外的空间来处理对齐。 源代码是:
MemoryRef(int capacity) {
VMRuntime runtime = VMRuntime.getRuntime();
buffer = (byte[]) runtime.newNonMovableArray(byte.class, capacity + 7);
allocatedAddress = runtime.addressOf(buffer);
// Offset is set to handle the alignment: http://b/16449607
offset = (int) (((allocatedAddress + 7) & ~(long) 7) - allocatedAddress);
isAccessible = true;
isFreed = false;
}
【问题讨论】:
-
长度是属性而不是函数。
-
尝试使用
capacity()。您通常甚至不能保证array()不会抛出UnsupportedOperationException,因为您的ByteBuffer往往没有可访问的byte[]支持。 -
frameRGBABuffer.array() 不抛出异常,我可以通过“frameRGBABuffer.array()[0]”打印其中的数据
标签: java android bytebuffer