gpt4 book ai didi

java - 获取直接缓冲区地址 : Address out by 4

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:39:55 25 4
gpt4 key购买 nike

我正在尝试将字节缓冲区从 Java 传递到 android 中的 native 代码。但是,我始终从索引 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 - 获取直接缓冲区地址 : Address out by 4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35049737/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com