Tag: swig

swig从struct中的变量获取返回类型作为java中的字符串数组

对于一个小型Java项目,我需要与用C编写的现有代码进行交互,所以为了简单起见(不幸的是我不是C / C ++程序员……)我决定使用swig。 我遇到的第一个问题:返回NULL分隔字符串的C函数导致返回String的包装代码,只包含第一个值,由Flexo提供的3(!)可能解决方案解决: SWIG从String获取返回类型java中的字符串数组 在继续开发这个项目时,我遇到了第二个问题(类似?)模式让我感到困惑:headerfile包含一个结构“PROJECTDETAILS”,它反过来包含一个变量itemList(应该)包含一个NULL分隔的String。 用于itemList的swig生成的getter将第一个结果作为String返回,就像我原始链接问题中的GetProjects函数一样(包含第一个结果的String)我试图将Flexo提供的答案应用于此问题,但是我’无法“键入”itemList变量 C头文件中的函数指出: typedef struct _PROJECT { int version; unsigned char vM; unsigned char fM; } * PROJECT; typedef struct _PROJECTDETAILS { int infoType; union { char *itemList; /* Returns a NULL-delimited string */ char *projectName; } info; } PROJECTDETAILS; DllImport PROJECT OpenProject dsproto((int, char *)); DllImport int GetProjectDetails […]

如何通过SWIG创建已包装库的扩展?

我有一个图书馆。 它是通过SWIG封装的。 我想创建一个插件来扩展它。 插件需要一个来自已经包装的库的类来运行类似void init( oldT old); 。 库使用Java和c#。 现在这个插件也将从那里使用。 库和插件是单独的dll。 如何在为插件创建绑定时已经拥有oldT类型的SWIG?

指向SWIG中C结构的python指针 – 访问struct成员

我正在尝试使用一个非常基本的Python-to-C接口与SWIG一起工作,我可以将一个指向结构的指针传递给一个C函数并且成员被填充,然后我可以访问python中的成员。 在下面的例子中,除了我尝试打印结构成员时,一切都有效: print swig_test.diags_mem0_get(var) 结果是: $ ./runpython.py Traceback (most recent call last): File “./runpython.py”, line 11, in print swig_test.diags_mem0_get(var) AttributeError: ‘module’ object has no attribute ‘diags_mem0_get’ 鉴于此: print var.mem0 结果是: $ ./runpython.py swig/python detected a memory leak of type ‘uint16_t *’, no destructor found. 我正在关注SWIG 3.0文档,特别是“5.5结构和联合”部分: http : //swig.org/Doc3.0/SWIGDocumentation.html#SWIG_nn31 我究竟做错了什么? 我把这个例子简化为裸骨: swig_test.h typedef struct diags_t […]

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

我正在使用SWIG生成一个调用’c’共享库的PHP扩展。 除了下面的情况,我能够让大多数事情发挥作用…… 在我的’c’代码中,我声明了一个函数(请注意结构和函数名称已被更改以保护无辜者): int getAllThePortInfo(EthernetPort *ports); 在这种情况下,参数端口实际上是EthernetPort结构的数组。 在另一个’c’程序中,我可以这样称呼它…… EthernetPort ports[4]; int rval = getAllThePortInfo(ports); 这很好用。 然后我运行SWIG,生成我的共享库,并且所有构建都很好。 我得到的PHP代码我可以调用… $ports = new_ethernetport(); $rval = getAllThePortInfo($ports); 这会导致PHP抛出以下错误: php:free():无效指针:0x099cb610 所以,我试着做一些像…… $ports = array(new_ethernetport(), new_ethernetport(), new_ethernetport(), new_ethernetport()); $rval = getAllThePortInfo($ports); 但后来PHP抱怨… PHP致命错误:在getAllThePortInfo的参数1中输入错误。 预计SWIGTYPE_p_EthernetPort 我认为正在发生的是PHP(和SWIG)没有区分指针和数组,而在包装器中,它正在考虑“指向单个结构的指针”,实际上,它是一个结构数组。 PHP中有什么我可以做的吗? 分配一块内存,我可以用作存储多个结构的空间? SWIG我能做些什么来让我的包装更好地理解我的意图吗? 我真的很感激任何建议。 谢谢。

Python,stdout,C和SWIG

假设我在c中有一个函数: 你好ç void hello() { printf(“Hello How are you”); } 现在将其包装到python函数hello.py 。 现在,当我运行python函数hello.py ,我得到输出,但我想将它保存到变量。 我尝试过使用这种方法: import sys import StringIO stdout = sys.stdout result = StringIO.StringIO() sys.stdout = result hello() sys.stdout = stdout result_osr_string = result.getvalue() print result.getvalue() 我认为问题在于swig到python的转换。 因为当我为一个简单的python函数尝试上面的方法时,它的工作原理。 我尝试使用fprintf而不是printf但即使这样也行不通。

用SWIG包装C结构

我有包含以下类型定义的C头文件: // example.h typedef struct Vertex { int color; } Vertex; 我尝试用SWIG包装这个结构,但显然我做错了。 我的SWIG界面文件看起来像 // example.i %module example %inline %{ #include “example.h” } 但是,如果我将头文件的内容复制到我的接口文件中,以便后者看起来像 %module example %inline %{ typedef struct Vertex { int color; } Vertex; %} 我可以通过以下方式从Ruby访问结构 irb> require ‘example’ # => true irb> Examlpe::Vertex # => Vertex 有没有办法自动包装头文件? 我不希望每次更改时都将头文件的内容复制并粘贴到接口文件中。 在此先感谢您的帮助。 – t6d

带指针结构的SWIG函数

我使用SWIG来包装C共享库。 我有问题在python中使用struct指针调用C函数。 我的文件: ST_Param.h: typedef struct { unsigned int* device_Address; …. …. unsigned int lock; }ST_param_ST; unsigned char ST_Param_Initialize(ST_param_ST * ST_param, unsigned int device_Address); ST_Param.c ……… Rest of file…………. unsigned char ST_Param_Initialize(ST_param_ST * ST_param, unsigned int device_Address){ if(ST_param == NULL){ ………. rest of funtion ………………….. return 0; } 在ST_Param_Initialize中我确认指针存在,如果不相信 ST_Param.i : /* File : ST_Param.i […]

为包含void *参数的函数创建SWIG C#包装器

我正在尝试为包含函数的C .lib创建一个C#包装器,使用SWIG获取一个void指针。 int inputPointExample(void* input); int outputPointerExample(void* output); 默认情况下,SWIG不处理void指针转换,您必须以某种方式使用类型映射。 我找到了这个页面 – > http://www.nickdarnell.com/2011/05/swig-and-a-miss/ Number 9表示使用以下类型映射来处理void指针… %typemap(ctype) void * “void *” %typemap(imtype) void * “IntPtr” %typemap(cstype) void * “IntPtr” %typemap(csin) void * “$csinput” %typemap(in) void * %{ $1 = $input; %} %typemap(out) void * %{ $result = $1; %} %typemap(csout) void * { return $imcall; } […]

如何在Swig中使用Python中的float **?

我正在为一些c函数编写swig绑定。 其中一个函数需要浮动**。 我已经在使用cpointer.i作为普通指针并查看了carrays.i ,但我没有找到一种方法来声明一个浮点数**。 您有什么推荐的吗? 接口文件: extern int read_data(const char * file,int * n_,int * m_,float ** data_,int ** classes_);

双向PyFloat转换是不正确的

我正在学习SWIG,因为在Python中使用C语言。 我写了这个函数,但我无法理解,为什么包装的myfunc返回错误的float / double值: mfuncs.c #include float myfunc(int n) { float result; result = 100 / n; return result; } mfuncs.i %module mfuncs %typemap(out) double, float “$result = PyFloat_FromDouble($1);” extern float myfunc(int n); 最后我得到1107558400.0而不是33.33333。 >>>导入mfuncs >>> mfuncs.myfunc(3) 1107558400.0 >>> 哪里出错了?