我知道一种方法 -memcpy
在 C++ 端使用:
C++ 方法:
void CopyData(void* buffer, int size)
{
memcpy(buffer, source, size);
}
JNR 映射:
void CopyData(@Pinned @Out ByteBuffer byteBuffer, @Pinned @In int size);
Java 调用:
ByteBuffer buffer = ByteBuffer.allocateDirect(size);
adapter.CopyData(buffer, size);
但是我想处理本机代码不复制数据而只返回指向要复制的内存的指针的情况:
C++ 方法:
void* GetData1()
{
return source;
}
// or
struct Data
{
void* data;
};
void* GetData2(Data* outData)
{
outData->data = source;
}
我知道如何编写 JNR 映射以便能够将数据复制到HeapByteBuffer
:
Pointer GetData1();
// or
void GetData2(@Pinned @Out Data outData);
final class Data extends Struct {
public final Struct.Pointer data;
public DecodeResult(Runtime runtime) {
super(runtime);
data = new Struct.Pointer();
}
}
Java 调用:
ByteBuffer buffer = ByteBuffer.allocate(size);
Pointer dataPtr = adapter.GetData1();
dataPtr.get(0, buffer.array(), 0, buffer.array().length);
// or
ByteBuffer buffer = ByteBuffer.allocate(size);
Data outData = new Data(runtime);
adapter.GetData2(outData);
Pointer dataPtr = outData.data.get();
dataPtr.get(0, buffer.array(), 0, buffer.array().length);
但是我还没有找到将内存复制到DirectByteBuffer
而不是HeapByteBuffer
. 上面的代码片段不起作用,DirectByteBuffer
因为buffer.array()
对于这样的缓冲区为 null,因为它由本机内存区域支持。
请帮忙。