在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);
   /* .... */
}

我以为一个有内存字段的结构就可以了,

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端)。这通常是不安全的。

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

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

相关内容

  • 没有找到相关文章