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);
}

获取直接地址时,获取的是有效地址,是对齐的,而实际缓冲区是不对齐的。