我正在尝试使用SWIG为我的C ++库创建一个Java包装器。
为了在Java编程环境中获得我需要的所有功能,我需要导演。
更具体地说,我需要Java用户能够从我的C ++类继承并实现某些方法。
特别是,需要实现的方法之一是某种clone()
方法。
在C ++中,用户实现提供了一个对象指针Base*
。然后,该指针由库本身管理。
Base* Derived::clone() {
return new Derived(*this);
}
我对Java包装器的问题是,Base
的Java代理类默认获取相应C ++导向器类SwigDirector_Base
的管理。
这当然适用于一般情况,但不适用于此特定用户定义的clone()
函数。
我个人的限制是我的C ++库的Java包装器不使用特定于Java的代码,因此用户实现应该如下所示:
class Derived {
...
Base clone() {
return new Derived(this);
}
}
到目前为止,为了使其工作并避免复制的Java实例的垃圾收集,我使用了http://www.swig.org/Doc2.0/SWIGDocumentation.html#CSharp_memory_management_member_variables中提到的技巧。
为了确保Java Derived
类永远不会删除相应的C ++ director类SwigDirector_Base
,我使用%typemap(directorout)
来设置复制实例的Java cMemOwn标志的值来自C ++包装器代码,即方法SwigDirector_Base::clone()
。
我对这个解决方案不太满意,因为它适用于返回指向Base
类的指针的所有方法,无论它是否是复制方法......
有关如何以特定功能的方式执行此操作的任何想法?或者以任何其他方式?