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

标签 java swig

我想在 Java 中将包含固定大小的无符号字符数组的结构包装为 byte[]。我的界面文件当前如下所示:

%module example
%include "arrays_java.i"

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

创建的 java 代理包含 get 和 set 方法,它们接受并返回一个短[]。

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

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

我知道 java 中的 byte 是有符号的,并且不覆盖 C 中 unsigned char 的范围,但是在它周围传递数据比处理 Short[] 或使用 array_class 创建的包装器要方便得多在 carrays.i 中定义,最终提供 getItem 和 setItem 方法,这些方法依次接受或返回短值。

所以我的问题是我是否可以以某种方式强制 swig (也许使用某种类型映射)将 unsigned char data[1024] 像 char[1024] 一样处理,因为它映射到 java 中的 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] };

这仅适用于任意大小或大小为 1024 的 unsigned char 类型的数组。


作为一个方便的提示:通过使用最初显示的“-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]
....

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

关于java - SWIG Java - 将 unsigned char[] 包装在 byte[] 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36451126/

相关文章:

java - 使用 SWIG 返回一个 java 对象数组

java - 如何在超时之前中断 Jsoup 获取线程?

java - FragmentTabHost Horizo​​ntal Scrollview + Swipe Android

java - 获取准备好的语句的可能数据类型 - Java DB2

java - 如何使用SWIG包装std::function对象?

java - 配置 SWIG 以使用 int32_t 输出参数为 C 函数创建适当的 Java 数据类型

c# - 使用 SWIG 从 C# 使用 C++ 游戏引擎

java Haversine公式(数学)NullPointerException错误问题

java - TableView JavaFX 应用程序线程“java.lang.NullPointerException

linux - cmake 找不到/usr/include/gnuradio/swig/gnuradio.i