栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

解决SWIG接口文件的结构属性

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

解决SWIG接口文件的结构属性

这些类型中的一些很容易映射到Java中简单直观的对象上:

  1. 对于
    off_t
    您可以使用:
    %apply int { off_t };

告诉SWIG将其

off_t
视为
int
Java。除非您期望
off_t
大于一个int,否则这可能会起作用。对于某些常见的typedef,SWIG已经在库中提供了适当的映射,我有点惊讶off_t不是其中之一。

(您也可以选择在界面文件中显示SWIG typedef,而不是使用

%apply

  1. 对于“简单”数组(即不是结构的事物的数组),其操作如下:
    %include <arrays_java.i>

足以生成一个直观的Java界面,例如添加导致

int field_offsets[VRTTXT_FIELDS_MAX]
被包装为as
publicvoid setField_offsets(int[] value)
和相应的get的添加。在为setter生成的代码中,有一个检查大小匹配的测试-
如果大小不匹配,则会在运行时抛出异常,因为Java中没有编译时间数组大小的概念。

  1. 这个答案讨论了Java的包装
    FILE*
    。在这种情况下,最简单的解决方案是使用类似以下内容的方法:
    %ignore text_file

    %include “header.h”
    %extend gaiaTextReader {
    void setTextFile(const char *fn) {
    $self->text_file = fopen(fn, “r”);
    }
    }

它隐藏自动设置/获取

text_file
,而是公开一个带字符串并调用的setter
fopen

您可以选择仍然很明显的链接答案中所示的更复杂的实现,或者可以使用它

%inline
来提供使用
SWIGTYPE_p_FILE
Java 创建的替代方法。

  1. 至于结构的阵列,最简单的办法是使用

    %ignore
    %extend
    再次,例如对于
    columns
    这是:

    %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调用,以从

Object
数组复制到结构数组)。

一个更优雅的解决方案可能是在Java中编写扩展的内容

AbstractList
(使用Java代码类型映射,具体取决于您要执行的操作),然后通过在Java中公开的内容来返回代理
%extend

  1. 成员

    %extend
    可以采用相同的方法
    toUtf8

    %ignore toUtf8;

    %include “header.h”

    %extend gaiaTextReader {
    void setToUtf8(const char *from) {
    $self->toUtf8 = iconv_open(“topre”, from);
    }
    }

(我不确定该字段的用法是否正确,但是无论如何都适用该原则)。

  1. 您的链表可以从Java中“自然地”遍历,尽管有可能/明智的(?)提供实现的代理

    AbstractSequentialList

  2. 因为

    int
    确实如此,
    enum
    您仍然可以使用适当的Java枚举来表示它:

    %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 };

(这里的顺序很重要-伪造的

enum
需要发生在之后
%include
,但是类型映射和前向声明需要发生在它之前)。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/570810.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号