我正在尝试让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.i
和MyDatabase
。但是,我希望由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真正有用的精神