使用 SWIG 将多个 Java 数据类型应用于同一 C 数据类型

发布于 2024-12-18 12:46:21 字数 785 浏览 0 评论 0原文

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

来自头文件的 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"

I have two C functions that I'm exposing through SWIG to my Java layer and both have an input param with a const void * data type ("val) that needs to be a uint8_t for the addCategory function but a char for the addAttribute function. I'm currently, in the SWIG Interface file, using the %apply to map the const void * C type to a short on the Java side. Is there a way to modify the SWIG interface file to support both a char (String) and a uint8_t (short) for the const void * input parameter?

C Functions from header file:

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

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

SWIG Interface File:

%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"

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

美人如玉 2024-12-25 12:46:21

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

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

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

    %模块测试
    
    联合值{
      无符号字符*字符串;
      无效*通用;
      uint8_t someOtherThing;
      uint32_t 数字;
    };
    
    无效函数(值v);
    

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

You can't directly do this - what type would be used in this place in Java? You need to help SWIG decide that in some way.

You have (at least) three possible solutions:

  1. Use a type hierarchy - The base type will be what the function takes, the subclasses will get wrapped also. You could do this on the C++ side, or on the Java side using SWIG's typemap facilities. I think this is needlessly complicated though, so I've not made an example here.
  2. Use overloads (or even different functions, with different names altogether - you could use %rename to make them back into overloads in Java even if they have different names in C)
  3. Use a union. This will get wrapped with set and get functions by SWIG:

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

    This results in a Java class called values, which func() takes and can pass one of the members of the union through. Clearly you'd want to %apply appropriate typemaps for the members of the union.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文