我可以制作一个 SWIG 宏来生成您正在寻找的代码。虽然有点麻烦,但确实有效。诀窍是滥用 javaout (noblock=1)类型映射而不是 javacode,以便每个函数应用一次而不是每个类应用一次:
%module test
%define WRAP(CLASS,METHOD)
%rename(METHOD ## _internal,fullname=1) CLASS::METHOD;
%javamethodmodifiers CLASS::METHOD "private";
%typemap(javaout,noblock=1) void CLASS::METHOD {
{
$jnicall;
}
public void METHOD() {
METHOD ## _internal();
// some other bits
}
}
%enddef
WRAP(Foo,bar)
WRAP(Foo,baz)
class Foo {
public:
void bar();
void baz();
};
这会生成您正在寻找的代码,但我怀疑您可以跳过%rename
完全从 javaout 类型映射中完成这一切。此方法适用于 SWIG 1.3 及更高版本。
我确实尝试了另一种方法$typemap
并复制类型映射,但这最终没有成功。
如果您想支持也返回内容的方法,您需要添加第三个宏参数:
%define WRAP(CLASS,METHOD,RETURN)
%rename(METHOD ## _internal,fullname=1) CLASS::METHOD;
%javamethodmodifiers CLASS::METHOD "private";
%typemap(javaout,noblock=1) RETURN CLASS::METHOD {
$typemap(javaout,RETURN)
public $typemap(jstype,RETURN) METHOD() {
RETURN result = METHOD ## _internal();
// some other bits
return result;
}
}
%enddef
$typemap
There 用于引用默认的、不太专业的类型映射,以避免为非原始/特殊情况返回重复大量代码。