1

我正在尝试使用 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类指针的方法,无论它是否是复制方法......

关于如何以特定功能的方式执行此操作的任何想法?或者以任何其他方式?

4

0 回答 0