0

我有以下 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 消息类包含传入的参数的长度和数组

请帮忙!

更新:我创建了自己的包含字节 [] 的消息结构副本:

    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
4

2 回答 2

0

解决方案:

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;
}
于 2015-03-23T17:19:01.973 回答
0

你不需要在这里复杂的结构,给定一个缓冲区指针,你可以显式地写你需要的东西。本机代码所做的只是将缓冲区的长度及其内容写入另一个缓冲区:

byte[] buffer;
int length;
Pointer msg_buffer = new Memory(buffer.length + 4);

msg_buffer.setInt(0, length);
msg_buffer.setByteArray(4, buffer, buffer.length);

当然,您可以预先分配一个固定缓冲区,而不是每次都创建一个新缓冲区(这是本机代码所做的)。

于 2015-03-23T10:10:43.767 回答