GetDirectBufferAddress:地址输出4

时间:2016-01-27 22:56:29

标签: java android java-native-interface bytebuffer

我试图将一个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;

1 个答案:

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

获得直接地址后,您将获得有效的地址,该地址已对齐,而实际的缓冲区未对齐。