我正在尝试使用 SWIG 为我的 C++ 库创建一个 Java 包装器。为了在 Java 编程环境中获得我需要的所有功能,我需要导向器。更具体地说,我需要 Java 用户能够从我的 C++ 类继承并实现某些方法。特别是,需要实现的方法之一是某种clone()
方法。
在 C++ 中,用户实现提供了一个对象指针Base*
。然后,该指针由库本身管理。
Base* Derived::clone() {
return new Derived(*this);
}
我对 Java 包装器的问题是 Java 代理类默认Base
获取相应 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中提到的技巧。
并且为了确保 JavaDerived
类永远不会删除相应的 C++ 导向器类SwigDirector_Base
,我习惯于%typemap(directorout)
从 C++ 包装器代码中设置复制实例的 Java cMemOwn 标志的值,即在方法中SwigDirector_Base::clone()
。
我对这个解决方案不太满意,因为它适用于所有返回Base
类指针的方法,无论它是否是复制方法......
关于如何以特定功能的方式执行此操作的任何想法?或者以任何其他方式?