【问题标题】:Renaming C struct properties using SWIG %apply使用 SWIG %apply 重命名 C 结构属性
【发布时间】:2011-12-12 15:44:08
【问题描述】:

我的 SWIG 接口文件和我的 sample.h 头文件中具有以下结构。我假设这个结构中的 sockaddr、ios_boolean 和 unsigned char 定义是我得到下面生成的类的原因。如果我知道 ios_boolean 和 unsigned char 映射到 Java 端的类型,有没有办法使用 %apply 来摆脱生成的指针类?我试过 %apply int {ios_boolean};但后来我得到了一个 SWIGTYPE_p_boolean.java。有什么想法吗?

%rename (Sample) sample_details_t_;
typedef struct sample_details_t_ {               
    ios_boolean                   is_allowed;           
    unsigned char                 mac[11];        
 } sample_t;


 generates:
 SWIGTYPE_p_unsigned_char.java
 SWIGTYPE_p_ios_boolean.java

例外:

 [exec] ewapi_wrap.c:982: error: `true' undeclared (first use in this function)
 [exec] ewapi_wrap.c:982: error: (Each undeclared identifier is reported only once
 [exec] ewapi_wrap.c:982: error: for each function it appears in.)
 [exec] ewapi_wrap.c:982: error: `false' undeclared (first use in this function

【问题讨论】:

    标签: swig


    【解决方案1】:

    你可能想做这样的事情:

    %include <arrays_java.i>
    %rename (Sample) sample_details_t_;
    %apply bool { ios_boolean };
    typedef struct sample_details_t_ {               
        ios_boolean                   is_allowed;           
        unsigned char                 mac[11];        
     } sample_t;
    

    这在 Java 端将 mac 包装为 short[](对数组大小有限制),将 is_allowed 包装为 boolean 并生成以下文件:

    Sample.java test.java testJNI.java

    确保从旧版本的 SWIG 界面中删除所有旧的 SWIGTYPE_*.java 文件,它们不会被自动删除,并且如果你执行 javac *.java 之类的操作可能无法编译。

    【讨论】:

    • 我刚刚尝试了您对 ios_boolean 的建议,在 SWIG 生成期间,我收到一个错误,似乎无法从 ios_boolean 转换为 bool。我在原始问题中添加了例外,因为如果我在这里添加它会很混乱。有什么想法吗?
    • @c12 你想#include stdbool.h 或定义真假常量或在界面顶部的 %{ %} 内包含库的 bool 标头。
    猜你喜欢
    • 2019-11-25
    • 1970-01-01
    • 2018-10-24
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    相关资源
    最近更新 更多