在JNA中传递带有Memory字段的结构

时间:2013-07-17 21:14:44

标签: java c malloc jna

我的动态C库接收一些(指向)结构,这些结构包含一个已分配的指针(通过malloc)。被调用的函数可以在其上调用realloc

typedef struct mystruct {
    void * buf;
    int buflen;
    /* more fields... */
} mystruct;


void myfunc(mystruct  *s1, /* more args*/) {  /* in dynamic library */
   /* .... */
      s1->buf = realloc(s1->buf,newsize);
   /* .... */
}

我认为具有Memory字段的结构可以解决问题,

public class MyStructJna extends Structure {
    public Memory buf;
    public Integer buflen;
            /* .... */
}

然后我得到了这个例外:

Exception in thread "main" java.lang.IllegalArgumentException: 
 Structure field "buf" was declared as class com.sun.jna.Memory, 
 which is not supported within a Structure
        at com.sun.jna.Structure.writeField(Structure.java:792)

任何解释和/或解决方法? 我正在使用JNA 4.0


这个问题得到了回答和接受,但我想补充一下这个警告,以防有人试图采用类似的方法:

这不是一个好的设计,因为DLL端将对JNA端分配的指针进行重新分配,最后,JNA端将尝试释放该指针(在DLL端分配)。这通常是不安全的。

1 个答案:

答案 0 :(得分:2)

您无法使用Memory,因为JNA必须能够自动初始化结构的所有字段。

您当然可以提供字段Pointer类型并为其分配Memory个对象。只要本机代码不修改其值,通常会保留该字段。