我试图将一个bytebuffer从Java传递给android中的本机代码。但是我一直在从索引4开始获取返回的内存地址。
我在各种设备上进行了测试,调用GetDirectBufferCapacity时,Java和JNI的数组大小相同。
为什么会发生这种偏移?
爪哇:
inputBuffer = ByteBuffer.allocateDirect(inputBufferSize);
JNI:
uint8_t* inputBuffer = (uint8_t*) env->GetDirectBufferAddress(inputByteBuffer);
给定的内存地址偏移4个字节,只有移动指针才能使数组匹配(如下所示)。
uint8_t* inputBuffer = (uint8_t*) env->GetDirectBufferAddress(inputByteBuffer) - 4;
答案 0 :(得分:2)
返回的地址是有效地址,基于缓冲区的对齐方式。代码(版权所有AOSP,保留所有权利)如下所示:
public static ByteBuffer allocateDirect(int capacity) {
if (capacity < 0) {
throw new IllegalArgumentException("capacity < 0: " + capacity);
}
// Ensure alignment by 8.
MemoryBlock memoryBlock = MemoryBlock.allocate(capacity + 7);
long address = memoryBlock.toLong();
long alignedAddress = (address + 7) & ~(long)7;
return new DirectByteBuffer(memoryBlock, capacity, (int)(alignedAddress - address), false, null);
}
获得直接地址后,您将获得有效的地址,该地址已对齐,而实际的缓冲区未对齐。