【问题标题】:SWIG, not able to create typemap for long*SWIG,无法长时间创建类型映射*
【发布时间】:2013-10-30 08:54:25
【问题描述】:

我有一个像这样的 C 函数:

int make_call(char* to, int *call_id);

还有一个非常简单的接口文件:

%include "typemaps.i"
%include "enums.swg"
%include "arrays_java.i"

%header %{
#include <my_header.h>
%}

/* Map "int*" as input & output */
%apply int *INOUT  { int * };

这很好用。在我的 SWIG 文件中,我得到: 公共静态 int make_call(String to, int[] call_id) {..} 我可以称之为用一个元素创建一个 int[] 。到目前为止一切顺利。

但是由于 call_id 可能非常大,它需要很长,所以我在 C API 中更改了它,并在 .i 文件中添加了这一行:

%apply long *OUTPUT  { long * };

我尝试了几种变体,包括尝试将 java.html 文档中所说的内容应用于 SWIG,但我总是最终生成一个 int[] 蜜蜂,或者可能是我无法从 Java 使用的 swigtype 很长时间.我只是无法让它生成我期望的 long[]。

我试着把它变成这样的双倍:

%apply double *OUTPUT  { double * };

它按预期工作,我在生成的界面中获得了我的 double[] call_id。

long 类型有什么缺陷吗?看起来很奇怪吧?

【问题讨论】:

  • 我认为这取决于您的架构。 long 也可以是 32 位的 int。你试过long long吗?或者更好的uint64_tuint32_t?您可以检查 stdint.h 以了解您的架构,应该是什么 8 字节整数。
  • 目前适用于 Android,但 C API 必须是跨平台的,所以我不确定使用 long then 是否朝着正确的方向前进?
  • 我不知道 Android 是否完全支持 C99 标准,如果支持 uint64_t 在 stdint.h 中也有很好的定义,这正是您在定义跨平台 API 时要寻找的。所以我最好的选择是,通过将 stdint.h 包含到您的 swig 界面中并使用 uint64_t 作为变量类型,一切都应该开箱即用。如果是 MSW,google 代码上还有 msinttypes.h。
  • 感谢博特的回复。我尝试了 long long 但结果相同。我可以得到一个 Swig 样式变量,如果我尝试使用类型映射,我只会得到一个 int[]。即使试图返回一个普通的 long 作为函数结果也只会给我一个 int。
  • 如果您陈述这种类型图的最初想法会有所帮助,因为我不确定您要实现什么。

标签: swig


【解决方案1】:

尝试以下之一:

unsigned long
unsigned int
long long

【讨论】:

  • 抱歉回复晚了。我前一段时间测试了这些,但我一定犯了一个错误。最后 long long 在 Java 中产生一个 long[] ,这就是我要寻找的。我最终得到了这个: %apply long long *OUTPUT { long *call_id };
猜你喜欢
  • 2019-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-06
  • 1970-01-01
  • 2019-01-25
  • 1970-01-01
相关资源
最近更新 更多