簡體   English   中英

JNA如何從C int *轉換為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM