使用SWIG为C结构生成代理类,为C结构指针生成包装器类

时间:2019-02-21 13:21:21

标签: java c swig

我正在尝试让SWIG生成Java粘合代码供我包装C库。

我有一个C头文件,看起来(大致)如下:

struct MyDatabase;
typedef struct MyDatabase MyDatabase;

struct MyDatabase {
  const void *db;
};

struct MyDatabase *open_database(char *name);

我已经这样写了我的SWIG接口文件:

%module database

%{
#include "database.h"
%}

struct MyDatabase;

%nodefaultctor MyDatabase;
%nodefaultdtor MyDatabase;
struct MyDatabase {
  const void *db;
};

struct MyDatabase *open_database(char *name);

%include "cpointer.i"
%pointer_functions(MyDatabase, MyDatabasePtr)

我正在跑步:

swig -java -package com.test.db -outdir com/test/db -o database.c database.i

我想要在Java代码中执行的操作如下:

SWIGTYPE_p_MyDatabase dbPointer = open_database("some_db_name");
MyDatabase db = MyDatabasePtr_value(dbPointer);

或者类似的东西。从本质上讲,我希望能够调用C库的open_database,该库将返回指向MyDatabase的指针,然后能够访问基础MyDatabase实例,以便访问其上的属性。等等

我面临的问题是我似乎无法让SWIG为MyDatabase生成代理类,也无法为指向MyDatabase的指针生成包装器类(即{ {1}}。

我可能会完全以错误的方式来做,但是到目前为止,看来上面的接口文件应该允许我这样做,但事实并非如此,显然我缺少了一些东西! / p>


更新1:

如果将SWIGTYPE_p_MyDatabase添加到%include "database.h",则会同时生成database.iMyDatabase。但是,我希望由SWIGTYPE_p_MyDatabase生成的指针函数最终会产生以下结果:

%pointer_functions(MyDatabase, MyDatabasePtr)

据我所知,这不是很有用。我期望的功能是:

public static SWIGTYPE_p_MyDatabase MyDatabaseHandle_value(SWIGTYPE_p_MyDatabase obj) {
    return new SWIGTYPE_p_MyDatabase(databaseJNI.MyDatabaseHandle_value(SWIGTYPE_p_MyDatabase.getCPtr(obj)), true);
}

将功能手动更改为上述功能确实可行,但这并不是一个长期解决方案,也不是出于SWIG真正有用的精神

0 个答案:

没有答案