用 SWIG array_class 包装字节数组数据

Posted

技术标签:

【中文标题】用 SWIG array_class 包装字节数组数据【英文标题】:wrapping byte array data with SWIG array_class 【发布时间】:2012-02-18 00:37:36 【问题描述】:

我有一个 C 函数,它返回一个 unsigned char *,它可以是指向字节数组(表示 File..etc 的二进制数据)的指针,也可以是指向字符数组的指针。我目前正在使用 SWIG %array_class 包装所有返回无符号字符指针的 C 函数并创建 Java 数组实用程序 (SampleArrayUtil.java) 来处理 Java 端的填充和检索。

我的问题是我还使用包装 unsigned char * using: %apply char * unsigned char * ; 以便在 Java 端获得一个字符串数组。当我取回二进制数据时,我不想包装unsigned char * 返回值(使用%apply char * unsigned char * ;),我只想在Java 端使用字节数组。我正在考虑创建另一个 C 函数来处理二进制数据,但我不确定如何包装这个新函数,因为它还会返回 unsigned char *(请参阅 getValueFromRowAsByteArray

C 函数:

unsigned char * getValueFromRowAsStringArray(struct result_row *row, attribute_type type, int32_t *len)

unsigned char * getValueFromRowAsByteArray(struct result_row *row, attribute_type type, int32_t *len)
//*row* input param with data results, *type* input enum type for the data type being requested and *len* is an output param that contains the length of the data being returned.

用于包装返回 unsigned char *(char 数组)的 C 函数的 SWIG 接口文件:

%module Sample
%include "typemaps.i"
%include "stdint.i"
%include "arrays_java.i"
%include "carrays.i"
%array_class(unsigned char, SampleArrayUtil);
%
#include "C_API.h"
%
%apply char *  unsigned char * ;
%include "C_API.h"

【问题讨论】:

所以您希望在 Java 接口上从 C 端的相同类型返回不同的类型 - 您想有选择地应用类型映射吗? (在我写答案之前检查我们是否在同一页面上) @awoodland - 是的,没错。 【参考方案1】:

您可以通过至少两种方式将不同的类型映射应用于不同位置的相同类型。

首先,您可以使用%apply%clear 更改活动类型映射,例如:

%module test

%include "stdint.i"

%apply intptr_t  unsigned char * ;
unsigned char * test1();

%apply char *  unsigned char * ;
unsigned char * test2();

%clear unsigned char *;
unsigned char * test3();

根据活动类型映射,在 Java 中提供三个具有不同返回类型的函数。

其次,您也可以编写更具体的类型映射,例如:

%apply long long  unsigned char * test4 ;
%apply char *  unsigned char * test5 ;
unsigned char * test4();
unsigned char * test5();

分别仅适用于test4test5 - 它匹配类型和函数名称。在 Java 中,这会导致:

  public static long test4() 
    return testJNI.test4();
  

  public static String test5() 
    return testJNI.test5();
  

对于参数,您可以类似地匹配函数签名中的类型和参数名称。

【讨论】:

以上是关于用 SWIG array_class 包装字节数组数据的主要内容,如果未能解决你的问题,请参考以下文章

带有 SWIG 未知长度数组的 NumPy C 扩展

swig-php 包装器使用指针,c 代码是一个数组

SWIG 'cstring.i' Python 返回字节类型而不是字符串类型

通过 SWIG 将 Python 3 个字节输入到 C char*

用 SWIG 包装 C 结构

使用 SWIG 将 C++ <vector> 包装为 python NumPy 数组