我想在Java中将包含固定大小的unsigned char数组的struct包装到byte []。我的界面文件目前如下所示:
%module example
%include "arrays_java.i"
struct myStruct
{
unsigned char data[1024];
int len;
};
创建的java代理包含get和set方法,它们接受并返回short []。
有没有办法,如果有,我可以使用byte []而不是short []强制SWIG生成java代理的最简单方法是什么?
我不想以任何方式更改结构。这只是我必须包装的一个非常大的接口的简化示例,我无法改变。
我知道java中的byte是有符号的,并且没有覆盖C中unsigned char的范围,但是为了传递数据它比处理short []或创建的包装更方便使用carrays.i中定义的array_class,最终提供getItem和setItem方法,这些方法又采用或返回短路。
所以我的问题就是如果我能以某种方式强制swig(可能有一些typemap)来处理unsigned char数据[1024],如char [1024],因为它映射到java中的byte []。
答案 0 :(得分:2)
我们可以强制SWIG将您的unsigned char数组视为已签名的char数组,仅用于使用%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]
....
显示了哪些类型地图将以您的界面使用的每个类型地图的优先顺序应用。