Tag: swig

如何将SWIG类型映射应用于双指针结构参数

我有一个API,我试图使用SWIG包装,以便我可以从python调用底层的C库。 我遇到了一个特定的API fn: int update_tracks(track_t **phash_tracks, const pdws_t *pdw_frame, const rdws_t *rdw_frame, lib_t *lib, lib_meta_t *lib_meta, const cfg_t *cfg); 它是track_t数据结构的双指针,我无法处理。 所有单指针都可以正常工作。 这是唯一具有指向track_t的双指针的API fn 所有其他只有一个指针,例如 void print_hash_tracks(const track_t *hash_tracks, const cfg_t *cfg, enum TRKTYPE trktype); 我很确定我需要在SWIG界面文件(interface.i)中创建一个类型图,但我发现SWIG文档难以理解。 我认为我需要做的是创建一个类型图,每当它看到track_t**类型时,它需要一个track_t*并将其转换为它的地址,如: /* provide typemap to handle instances of track_t** parameters */ %typemap(in) track_t** (track_t *tracks) { $1 = &tracks; } […]

SWIG和C / C ++ Python API连接 – SEGFAULT

我的任务是创建双重程序。 一开始我启动C程序,通过Python的C / C ++ API调用一些Python方法。 之后调用的方法调用使用SWIG创建的函数。 在给出Segmentation fault之后,我还会向你展示我的样本以及来自gdb的回溯。 main.c中: #include #include #include “utils.h” int main(int argc, char** argv) { printf(“Calling from C !\n”); increment(); int i; for(i = 0; i < 11; ++i) { Py_Initialize(); PyObject *pname = PyString_FromString("py_function"); PyObject *module = PyImport_Import(pname); PyObject *dict = PyModule_GetDict(module); PyObject *func = PyDict_GetItemString(dict, "ink"); PyObject_CallObject(func, NULL); […]

Swig:将Java中的字节数组传递给C语言

我正在尝试使用Swig创建用于将byte []传递给C的Java实现。 痛饮: %include “typemaps.i” %apply(char *STRING, int LENGTH) { (char *buff, int len) }; %inline { typedef struct { char* buff; int len; } workit_t; } 在我生成的java类(workit_t.java)中,参数buff是String,而不是byte []。 Java的: public void setBuff(String value){ … } 我的swig定义中我做错了什么? 当我编写一个没有结构的简单swig定义时,我得到了所需的参数类型。 痛饮: %include “typemaps.i” %apply(char *STRING, int LENGTH) { (char *buff1, int *len1) }; Java的: public static void […]

SWIG将生成的类从不同的模块和包导入当前类

我很难让SWIG类型映射(javapackage)正常工作。 我尝试制作一个问题的简单版本,即使这似乎也失败了。 foo.h中: #ifndef FOO_H #define FOO_H class Foo { public: Foo() {}; int doSomething() { return 1 }; }; #endif bar.h: #ifndef BAR_H #define BAR_H #include “foo.h” class Bar { public: Bar() {}; int doSomething(Foo foo) { return foo.doSomething(); }; }; #endif Foo.i %module FooMod %include “typemaps.i” %include “stdint.i” %{ #include “../header/foo.h” %} %include […]

Swig,返回一系列双打

我知道,通常有很多方法可以解决某些问题。 但在这里,我知道我希望它采用哪种方式,但我无法使其与Python和SWIG一起使用… 我有一个C函数,它返回一个double值数组: double *my(int x) { double a,b,*buf; buf = malloc (x * sizeof(double)); a=3.14; b=2.7; buf[0]=a; buf[1]=b; return buf; } 在这里,我明确地希望将数组作为返回值。 不像在许多示例中那样写入输入数组的’void’函数。 现在,我想获得一个SWIG-python包装器,它可以用作: >>> import example >>> print example.my(7) [3.14,2.7] 无论我做什么,我都有一些概念上的问题 – 我总是得到s.th. 喜欢 我试图在swg文件中定义一些类型图: %typemap(out) double [ANY] { int i; $result = PyList_New($1_dim0); for (i = 0; i < $1_dim0; i++) { […]

C到Python通过SWIG:无法获取void **参数来保存它们的值

我有一个看起来像这样的C接口(简化): extern bool Operation(void ** ppData); extern float GetFieldValue(void* pData); extern void Cleanup(p); 使用如下: void * p = NULL; float theAnswer = 0.0f; if (Operation(&p)) { theAnswer = GetFieldValue(p); Cleanup(p); } 您将注意到Operation()分配缓冲区p,GetFieldValue查询p,以及Cleanup释放p。 我对C接口没有任何控制权 – 该代码在其他地方被广泛使用。 我想通过SWIG从Python调用此代码,但我无法找到如何将指针传递给指针的任何好例子 – 并检索其值。 我认为正确的方法是使用类型映射,所以我定义了一个接口,它会在C端为我自动取消引用p: %typemap(in) void** { $1 = (void**)&($input); } 但是,我无法使用以下python代码: import test p = None theAnswer = 0.0f […]

解析SWIG接口文件的结构属性

这是我问过的一个问题的延续。 为通过参数返回的函数创建一个typemap 在上一个问题中,接口文件如下: %module test %{ #include “header.h” %} %inline %{ %immutable; struct FieldFetch { int status; int type; char *value; }; %mutable; struct FieldFetch gaiaTextReaderFetchField(gaiaTextReaderPtr reader, int field_num) { struct FieldFetch result; result.status = gaiaTextReaderFetchField(reader, field_num, &result.type, &result.value); return result; } %} %ignore gaiaTextReaderFetchField; %include “header.h” 我现在必须解析位于structs.h中的gaiaTextReaderPtr结构。 这个结构位于以下代码的底部,尽管我已经包含了其中的其他代码以提供完整的图片。 我已经为创建了SWIG opaque数据类型的行加下划线 /** Virtual Text driver: […]

使用Swig在Python模块中包装C-enum

我在myenum.h中的C中有一个简单的枚举: enum MyEnum { ONE, TWO, THREE }; 问题是当我将它映射到Python时,我只能通过模块名称访问枚举,而不是通过MyEnum。 因此值ONE,TWO,THREE包含在我定义的任何其他函数中,而不是包含在MyEnum中。 我的api.i文件是: %module api %{ #include “myenum.h” %} %include “myenum.h” 我用SWIG生成 swig -builtin -python api.i 并将其导入Python import _api 现在我必须使用_api模块中的枚举值: _api.ONE _api.TWO _api.THREE 虽然我想像他们一样使用它们 _api.MyEnum.ONE _api.MyEnum.TWO _api.MyEnum.THREE 有谁知道我怎么能做到这一点?

扩展’不完整’类型(SWIG)

我正在寻找一种扩展方法(即使用%extend指令将新成员添加到类型中)一种在库文件本身中定义的类型,而库的头文件仅提供该类型的前向声明。 处理类型,就好像它的定义在编译时已知,会导致以下警告: Warning 303: %extend defined for an undeclared class [name of the type]. 是否有人知道此问题的解决方案或解决方法? 我确信有一个,因为SWIG的文档声明swig假定每次找到未知类型是结构或联合。 提前谢谢了!

使用SWIG的C ++到C包装器(用于FLTK)

我需要为FLTK C ++类生成包装器以在纯C中使用它。我知道,SWIG可以做到这一点,我知道如何为C#,Python等生成包装器。但我不知道如何使用C ++包装C ++痛饮。 这是一项简单的任务,但我找不到答案:)请帮忙。