GetDirectBufferAddress:地址输出4
GetDirectBufferAddress: Address out by 4
我正在尝试将字节缓冲区从 Java 传递到 android 中的本机代码。但是我一直在获取从索引 4 开始的返回内存地址。
我已经在各种设备上进行了测试,当调用 GetDirectBufferCapacity 时,Java 和 JNI 中的数组大小相同。
为什么会出现这种偏移?
Java:
inputBuffer = ByteBuffer.allocateDirect(inputBufferSize);
JNI:
uint8_t* inputBuffer = (uint8_t*) env->GetDirectBufferAddress(inputByteBuffer);
给定的内存地址偏移了4个字节,只有移动指针才能匹配数组(如下所示)。
uint8_t* inputBuffer = (uint8_t*) env->GetDirectBufferAddress(inputByteBuffer) - 4;
返回的地址是有效地址,基于缓冲区的对齐方式。代码(版权所有 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);
}
获取直接地址时,获取的是有效地址,是对齐的,而实际缓冲区是不对齐的。
我正在尝试将字节缓冲区从 Java 传递到 android 中的本机代码。但是我一直在获取从索引 4 开始的返回内存地址。
我已经在各种设备上进行了测试,当调用 GetDirectBufferCapacity 时,Java 和 JNI 中的数组大小相同。
为什么会出现这种偏移?
Java:
inputBuffer = ByteBuffer.allocateDirect(inputBufferSize);
JNI:
uint8_t* inputBuffer = (uint8_t*) env->GetDirectBufferAddress(inputByteBuffer);
给定的内存地址偏移了4个字节,只有移动指针才能匹配数组(如下所示)。
uint8_t* inputBuffer = (uint8_t*) env->GetDirectBufferAddress(inputByteBuffer) - 4;
返回的地址是有效地址,基于缓冲区的对齐方式。代码(版权所有 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);
}
获取直接地址时,获取的是有效地址,是对齐的,而实际缓冲区是不对齐的。