Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JNA如何从C int*转换为JNA结构_Java_Pointers_Struct_Jna_Jnaerator - Fatal编程技术网

Java JNA如何从C int*转换为JNA结构

Java JNA如何从C int*转换为JNA结构,java,pointers,struct,jna,jnaerator,Java,Pointers,Struct,Jna,Jnaerator,我尝试将以下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, size

我尝试将以下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

这里不需要复杂的结构,只要有一个缓冲区指针,就可以显式地编写所需的内容。本机代码所做的只是将缓冲区的长度后跟其内容写入另一个缓冲区:

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
我必须为message类创建一个新的构造函数,以便让结构使用我的指针。注:尺寸无意义:

public message(Pointer p, int size) {
    super(p);
    this.length_u = size;
}

我试着编辑你的帖子以使其格式正确,但结果一塌糊涂。请修改内容以使用空格,而不是每个空格!当我使用空格时,它将多个空格合并到一个空格中,就像html一样,所以我将它们切换到nbsp。是否有其他方法发布它?选择所有代码并单击[{}]按钮缩进块,从而保留其格式。这很有用。我忘了提到我需要将消息结构传递到一个方法中。对不起,我不太会问问题。在c代码中:query_exqueryMessage;因此,它期望结构作为参数。我想我可能需要修改结构以包含bytebuffer,但我不知道本机C方法是否允许这样做。我想我可能有它。我制作了自己版本的messageEx消息,其中包含字节[],然后我这样做了。struct类有它的大小:`int size=struct.size;字节[]缓冲区=新字节[大小];ByteBuffer bb=ByteBuffer.wrapbuffer;bb.putIntsize;bb.putstruct.getPointer.getByteArray0,大小;messageEx msg=newmessageexbuffer;`你看到什么问题了吗?我要到明天才能尝试:9修改/附加到原始问题,或者问一个新问题,如果有显著不同。