【问题标题】:Use SWIG to apply multiple Java data types for same C data type使用 SWIG 为同一 C 数据类型应用多个 Java 数据类型
【发布时间】:2011-11-29 18:16:23
【问题描述】:

我有两个 C 函数,我通过 SWIG 向我的 Java 层公开,它们都有一个输入参数,其数据类型为 const void * 数据类型(“val),对于 addCategory 函数需要是 uint8_t,但对于addAttribute 函数。我目前在 SWIG 接口文件中,使用 %apply 将 const void * C 类型映射到 Java 端的 short 。有没有办法修改 SWIG 接口文件以同时支持 char (字符串)和 const void * 输入参数的 uint8_t(短)?

头文件中的C函数:

int
addCategory(query_t *query, type_t type, const void *val);

int
addAttribute(query_t *query, type_t type, const void *val);

SWIG 接口文件:

%module Example
%include "stdint.i"
void setPhy_idx(uint32_t value);
%include "arrays_java.i"
void setId(unsigned char *value);
%{
#include "Example.h"
%}
%apply char * { unsigned char * };
%apply char * { void * };
%apply uint8_t { const void * }
%apply int32_t { int32_t * }
%include "Example.h"

【问题讨论】:

    标签: swig


    【解决方案1】:

    你不能直接这样做——在 Java 中这个地方会使用什么类型?您需要以某种方式帮助 SWIG 做出决定。

    你有(至少)三种可能的解决方案:

    1. 使用类型层次结构 - 基类型将是函数所采用的,子类也将被包装。您可以使用 SWIG 的类型映射工具在 C++ 端或 Java 端执行此操作。不过我认为这是不必要的复杂,所以我在这里没有做例子。
    2. 使用重载(甚至是不同的函数,完全不同的名称 - 您可以使用 %rename 将它们重新转换为 Java 中的重载,即使它们在 C 中具有不同的名称)
    3. 使用union。这将使用 SWIG 的 setget 函数进行包装:

      %module test
      
      union values {
        unsigned char *string;
        void *generic;
        uint8_t someOtherThing;
        uint32_t number;
      };
      
      void func(values v);
      

      这会产生一个名为values 的Java 类,func() 接受并可以传递联合的成员之一。显然,您希望 %applyunion 的成员提供适当的类型映射。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-23
      • 2016-11-12
      • 1970-01-01
      • 2017-12-11
      相关资源
      最近更新 更多