Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.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 解析SWIG接口文件的结构属性_Java_C_Swig - Fatal编程技术网

Java 解析SWIG接口文件的结构属性

Java 解析SWIG接口文件的结构属性,java,c,swig,Java,C,Swig,这是我刚才问的问题的继续 在上一个问题中,接口文件如下所示: %module test %{ #include "header.h" %} %inline %{ %immutable; struct FieldFetch { int status; int type; char *value; }; %mutable; struct FieldFetch gaiaTextReaderFetchField(gaiaTextReaderPtr rea

这是我刚才问的问题的继续

在上一个问题中,接口文件如下所示:

%module test

%{
#include "header.h"
%}

%inline %{
  %immutable;
  struct FieldFetch {
    int status;
    int type;
    char *value;
  };
  %mutable;

  struct FieldFetch gaiaTextReaderFetchField(gaiaTextReaderPtr reader, int field_num) {
    struct FieldFetch result;
    result.status = gaiaTextReaderFetchField(reader, field_num, &result.type, &result.value);
    return result;
  }
%}

%ignore gaiaTextReaderFetchField;
%include "header.h"
现在,我必须解析位于structs.h中的gaiaTextReaderPtr结构。 这个结构位于下面代码的底部,尽管我也包含了其他结构,以提供完整的图片

我已经用正在创建的SWIG不透明数据类型在这些行下面划线

/** Virtual Text driver: MAX number of fields */
#define VRTTXT_FIELDS_MAX   65535
/** Virtual Text driver: MAX block size (in bytes) */
#define VRTTXT_BLOCK_MAX 65535

/** Virtual Text driver: TEXT value */
#define VRTTXT_TEXT     1
/** Virtual Text driver: INTEGER value */
#define VRTTXT_INTEGER  2
/** Virtual Text driver: DOUBLE value */
#define VRTTXT_DOUBLE   3
/** Virtual Text driver: NULL value */
#define VRTTXT_NULL 4


/**
 Container for Virtual Text record (line)
 */
    struct vrttxt_line
    {
/* a struct representing a full LINE (aka Record) */
/** current offset (parsing) */
    off_t offset;
//__^________________________________________________________SWIGTYPE_p_off_t
/** line length (in bytes) */
    int len;
/** array of field offsets (where each field starts) */
    int field_offsets[VRTTXT_FIELDS_MAX];
//__^________________________________________________________SWIGTYPE_p_int
/** number of field into the record */
    int num_fields;
/** validity flag */
    int error;
    };

/**
 Container for Virtual Text record (line) offsets 
 */
    struct vrttxt_row
    {
/* a struct storing Row offsets */
/** Line Number */
    int line_no;
/** start offset */
    off_t offset;
//__^________________________________________________________SWIGTYPE_p_off_t
/** record (line) length (in bytes) */
    int len;
/** number of fields into this record */
    int num_fields;
    };

/**
 Container for Virtual Text block of records
 */
    struct vrttxt_row_block
    {
/*
/ for efficiency sake, individual Row offsets 
/ are grouped in reasonably sized blocks
*/
/** array of records [lines] */
    struct vrttxt_row rows[VRTTXT_BLOCK_MAX];
/** number of records into the array */
    int num_rows;
/** min Line Number */
    int min_line_no;
/** max Line Number */
    int max_line_no;
/** pointer to next item [linked list] */
    struct vrttxt_row_block *next;
    };

/** 
 Container for Virtual Text column (field) header
 */
    struct vrttxt_column_header
    {
/* a struct representing a Column (aka Field) header */
/** column name */
    char *name;
/** data type: one of GAIA_NULL_VALUE, GAIA_INT_VALUE, GAIA_DOUBLE_VALUE, GAIA_TEXT_VALUE */
    int type;
    };

/**
 Container for Virtual Text file handling
 */
    typedef struct vrttxt_reader
    {
/* the main TXT-Reader struct */
/** array of columns (fields) */
    struct vrttxt_column_header columns[VRTTXT_FIELDS_MAX];
/** FILE handle */
    FILE *text_file;
//__^________________________________________________________SWIGTYPE_p_FILE
/** handle to ICONV converter object */
    void *toUtf8;       /* the UTF-8 ICONV converter */
//__^________________________________________________________SWIGTYPE_p_void
/** field separator character */
    char field_separator;
/** text separator character (quote) */
    char text_separator;
/** decimal separator */
    char decimal_separator;
/** TRUE if the first line contains column names */
    int first_line_titles;
/** validity flag */
    int error;
/** pointer to first block of records [linked list] */
    struct vrttxt_row_block *first;
/** pointer to last block of records [linked list] */
    struct vrttxt_row_block *last;
/** array of pointers to individual records [lines] */
    struct vrttxt_row **rows;
//__^________________________________________________________SWIGTYPE_p_p_vrttxt_row
/** number of records */
    int num_rows;
/** current Line Number */
    int line_no;
/** max number of columns (fields) */
    int max_fields;
/** current buffer size */
    int current_buf_sz;
/** current buffer offset [parsing] */
    int current_buf_off;
/** I/O buffer */
    char *line_buffer;
/** current field buffer */
    char *field_buffer;
/** array of field offsets [current record] */
    int field_offsets[VRTTXT_FIELDS_MAX];
//__^________________________________________________________SWIGTYPE_p_int
/** array of field lengths [current record] */
    int field_lens[VRTTXT_FIELDS_MAX];
//__^________________________________________________________SWIGTYPE_p_int
/** max field [current record] */
    int max_current_field;
/** current record [line] ready for parsing */
    int current_line_ready;
    } gaiaTextReader;
/**
 Typedef for Virtual Text file handling structure

 \sa gaiaTextReader
 */
    typedef gaiaTextReader *gaiaTextReaderPtr;
如果您有任何帮助,我们将不胜感激! 问候汉克


第二部分

1:一位开发人员对void toUtf8说了这样的话:

嗨,汉克

“void*”指针只是一个普通的不透明内存指针;它是 基本上是一个把手

在特定上下文中,“void*toUtf8”引用内部结构 ICONV要求。引用的对象必须由 上一次调用gaiaCreateUTF8Converter(),预计将 通过调用GaiaFreeF8Converter()在之前或之后销毁;每个 调用gaiaFreeUTF8Converter()需要将此指针作为 争论

从Java/SWIG的角度来看,它只是一个常量值 按原样来回传递。(a)任何企图直接 更改、访问或取消引用此指针很容易导致 灾难==系统崩溃)

再见,桑德罗

2:我还有几个其他的结构,这些是gg_structs.h中最后一个,它们在使用以下内容时出现问题

/** COORDs mem-array */
double *Coords;               /* X,Y [vertices] array */
目前,我刚刚提出:

%apply double[] {double *};
这已经澄清了问题,但我不确定这是否正确。我应该单独针对阵列吗?事实上,我很确定这是不正确的,只要看看它创建的类,就会发现:

  public void setCoords(double[] value) {
    gg_structsJNI.gaiaLinestring_Coords_set(swigCPtr, this, value);
  }

  public double[] getCoords() {
    return gg_structsJNI.gaiaLinestring_Coords_get(swigCPtr, this);
  }
这不是应该有一个:int索引才能正常工作吗?我做了两件事:

%ignore Coords;
%include "gg_structs.h"

%extend gaiaLinestring {
  void setCoords(int index, double value) {
    $self->Coords[index] = value;
  }

  double getCoords(int index) {
    return $self->Coords + index;
  }
}

3:我想了解更多关于提供实现AbstractSequentialList的代理的信息。这就是所谓的动态代理吗?

其中一些类型很容易映射到Java中简单直观的内容上:

  • 对于
    off\t
    ,您可以使用:

    %apply int { off_t };
    
    告诉SWIG在Java中将
    off\u t
    视为
    int
    。除非您希望
    off\t
    大于int,否则这可能会起作用。对于一些常见的typedefs SWIG已经在库中提供了适当的映射,我有点惊讶于它不是其中之一

    (您也可以选择在界面文件中显示SWIG类型定义,而不是使用
    %apply

  • 对于“简单”数组(即非结构的事物数组),执行以下操作:

    它隐藏了
    text\u文件的自动set/get,而公开了一个setter,该setter接受字符串并调用
    fopen

    显然,您可以选择链接答案中更复杂的实现,也可以使用
    %inline
    来提供用Java创建
    SWIGTYPE\u p_文件的替代方法

  • 对于结构数组,最简单的解决方案是再次使用
    %ignore
    %extend
    ,例如,对于
    ,这是:

    %ignore columns;    
    %include "header.h"
    
    %extend gaiaTextReader {
      struct vrttxt_column_header *getColumn(int i) {
        return $self->columns + i;
      }
    
      void setColumn(struct vrttxt_column_header *c, int i) {
        $self->columns[i] = *c;
      }
    }
    
    这比编写类型映射更简单(这将涉及大量JNI调用,以将
    对象
    数组复制到结构数组中)

    一个更优雅的解决方案可能是在Java中编写一些扩展(使用,具体取决于您想要做什么)和代理,这些代理通过您在
    %extend

  • 对于
    toUtf8
    成员,可以采用相同的方法来扩展
    %extend

    %ignore toUtf8;
    %include "header.h"
    
    %extend gaiaTextReader {
      void setToUtf8(const char *from) {
        $self->toUtf8 = iconv_open("tocode", from);
      }
    }
    
    (我不确定这个字段的用法是否正确,但不管怎样,原则都适用)

  • 您的链表已经可以从Java“自然地”遍历了,尽管提供一个实现的代理也是可能的/明智的(?)

  • 对于
    int
    这实际上是一个
    enum
    ,您仍然可以使用它来表示:

    %include <enums.swg>
    %javaconst(1);
    
    enum Type;
    %typemap(jstype) int type "$typemap(jstype,enum Type)"
    %typemap(javain) int type "$typemap(javain,enum Type)"
    
    %include "header.h"
    
    enum Type { TEXT=VRTTXT_TEXT,
                INTEGER=VRTTXT_INTEGER,
                DOUBLE=VRTTXT_DOUBLE,
                NONE=VRTTXT_NULL };
    
    %include
    %javaconst(1);
    枚举类型;
    %typemap(jstype)int type“$typemap(jstype,枚举类型)”
    %typemap(javain)int type“$typemap(javain,枚举类型)”
    %包括“header.h”
    枚举类型{TEXT=VRTTXT_TEXT,
    整数=VRTTXT_整数,
    DOUBLE=VRTTXT_DOUBLE,
    NONE=VRTTXT_NULL};
    
    (此处的顺序很重要-伪造的
    enum
    需要发生在
    %include
    之后,但类型映射和转发声明需要发生在它之前)


  • 有关
    文件*
    的信息,请参阅。我以后再看其他的。同时你能想出一个不太通用的标题吗?这一条适用于大多数swig问题:-)对此我深表歉意!谢谢@FlexoThanks@Flexo,感谢您在这方面花时间。我已经有了一个非常好的学习曲线在我面前!我用第二部分编辑了我的问题。亲切的问候。在问你之前,我只是想说我正在尽可能多地研究SWIG网站。嗨@Flexo,你知道我将如何处理这个双指针“struct vrttxt_row**rows”?
    %ignore toUtf8;
    %include "header.h"
    
    %extend gaiaTextReader {
      void setToUtf8(const char *from) {
        $self->toUtf8 = iconv_open("tocode", from);
      }
    }
    
    %include <enums.swg>
    %javaconst(1);
    
    enum Type;
    %typemap(jstype) int type "$typemap(jstype,enum Type)"
    %typemap(javain) int type "$typemap(javain,enum Type)"
    
    %include "header.h"
    
    enum Type { TEXT=VRTTXT_TEXT,
                INTEGER=VRTTXT_INTEGER,
                DOUBLE=VRTTXT_DOUBLE,
                NONE=VRTTXT_NULL };