SWIG Java - 在 byte[] 中包装 unsigned char[]

SWIG Java - Wrapping unsigned char[] in byte[]

我想将包含固定大小的 unsigned char 数组的结构包装到 Java 中的 byte[]。我的界面文件目前看起来像这样:

%module example
%include "arrays_java.i"

struct myStruct
{
   unsigned char data[1024];
   int len;
};

创建的 java 代理包含获取和设置方法,这些方法采用 return 短[]。

有没有办法,如果有,我可以强制 SWIG 使用 byte[] 而不是 short[] 生成 java 代理的最简单方法是什么?

我不想以任何方式更改结构。这只是一个非常大的接口的简化示例,我必须包装它,但我无法更改它。

我知道 java 中的 byte 是有符号的,不包括 C 中 unsigned char 的范围,但是为了传递数据,它比处理 short[] 方便得多或使用 carrays.i 中定义的 array_class 创建的包装器,它最终提供 getItem 和 setItem 方法,这些方法又采用或 return short.

所以我的问题是我是否可以强制 swig 以某种方式(可能使用某些类型映射)像 char[1024] 一样处理 unsigned char 数据[1024],因为它映射到 [=27= 中的 byte[] ].

我们可以强制 SWIG 将您的无符号字符数组视为有符号字符数组,以便仅使用 %apply 进行 SWIG 包装。例如使用:

%module example
%include "arrays_java.i"

%apply signed char[ANY] { unsigned char[ANY] };

struct myStruct
{
   unsigned char data[1024];
   int len;
};

将强制所有 unsigned char 任何(已知)大小的数组发生这种情况。 (将 %apply 视为类型映射复制和粘贴)

你也可以这样写:

%apply signed char[ANY] { unsigned char data[ANY] };

或者:

%apply signed char[ANY] { unsigned char data[1024] };

这将仅适用于任何大小的 unsigned char 类型的数组,或大小分别为 1024 的数组。


作为一个方便的提示:我通过使用最初显示的“-debug-tmsearch”标志调用 SWIG 准确地找出了我想要为 %apply 匹配的类型映射:

....
test.i:8: Searching for a suitable 'jni' typemap for: unsigned char data[1024]
  Looking for: unsigned char data[1024]
  Looking for: unsigned char [1024]
  Looking for: unsigned char data[ANY]
  Looking for: unsigned char [ANY]
  Using: %typemap(jni) unsigned char [ANY]
....

它向您显示哪些类型映射将以何种优先顺序应用于您的界面使用的每个类型映射。