![](/img/trans.png)
[英]How do I extract an array of `struct*` from a pointer to that array (in JNA)?
[英]JNA how do I go from a C int* to a JNA struct
我尝试将以下C代码映射到Java中:
int32 Query( void* qryBuffer,
uint32_t qryLength)
{
static int8_t sendBuffer[MAX_REQUEST_SIZE];
message* queryMessage;
...
queryMessage = (message*)sendBuffer;
memcpy( &sendBuffer[0], &qryLength, sizeof(qryLength) );
memcpy( &sendBuffer[sizeof(qryLength)], qryBuffer, qryLength );
...
query_ex(queryMessage);
}
typedef struct
{
uint32 length_u;
} message;
消息结构的JNA等效项是:
public static class message extends Structure {
public int length_u;
public message() {
super();
}
protected List getFieldOrder() {
return Arrays.asList("length_u");
}
public message(int length_u) {
super();
this.length_u = length_u;
}
public static class ByReference extends omni_message implements Structure.ByReference {
};
public static class ByValue extends omni_message implements Structure.ByValue {
};
};
我知道他们在C代码中正在做什么,但是我不知道如何在Java方面做到这一点。 我需要让Java消息类包含传入的参数的长度和数组
请帮忙!
更新:我创建了自己的消息结构副本,该消息结构包含byte []:
public static class messageEx extends Structure {
public byte[] buffer;
...
}
我将尝试将此结构传递给另一个结构,但我要等到明天才能进行测试。
int size = struct.size();
byte[] buffer = new byte[size];
ByteBuffer bb = ByteBuffer.wrap(buffer);
bb.putInt(size);
bb.put(struct.getPointer().getByteArray(0, size));
messageEx msg = new messageEx(buffer);
query_ex(msg); // call to native world
在这里,您不需要结构的复杂性,只要有了缓冲区指针,您就可以显式地编写所需的内容。 所有本机代码要做的就是将一个缓冲区的长度,然后将其内容写入另一个缓冲区:
byte[] buffer;
int length;
Pointer msg_buffer = new Memory(buffer.length + 4);
msg_buffer.setInt(0, length);
msg_buffer.setByteArray(4, buffer, buffer.length);
当然,您可以预先分配一个固定的缓冲区,而不是每次都创建一个新的缓冲区(这就是本机代码的作用)。
解:
public int query(Structure struct) {
struct.write(); // this makes sure all my data is being ref'd by the pointer
int size = struct.size();
Pointer p = new Memory(size + 4);
p.setInt(0, size);
p.write(4, struct.getPointer().getByteArray(0, size), 0, size);
message msg = new message(p, size);
query_ex(msg); // call to native world
我必须为消息类创建一个新的构造函数,以便可以使结构体使用我的指针。 注意:大小没有意义:
public message(Pointer p, int size) {
super(p);
this.length_u = size;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.