重命名SWIGTYPE并将代码注入生成的类

时间:2016-12-03 07:21:45

标签: java c++ swig

我正在使用SWIG生成的接口扩展用于从Java访问OpenCasCade C ++库的jCAE / occjava。

需要比较某些C ++端对象的相等性,即运算符==

Handle_Standard_Type的特定实例,其在库中使用以表示使用单例的动态类型信息,即或多或少类似于枚举。不要认为这是相关的,只需将其作为背景信息。

我可以使用以下SWIG定义

来完成这项工作
%typemap(javacode) Handle_Standard_Type& %{
   public boolean equals(Object obj) {
      boolean equal = false;
      if (obj instanceof $javaclassname)
         equal = ((($javaclassname)obj).swigCPtr == this.swigCPtr);
      return equal;
      }
   %}

然而,这会产生一个丑陋的类名SWIGTYPE_p_Handle_Standard_Type

我尝试了所有我能找到的东西,例如:

Remove SWIGTYPE from Generated Class name

但如果我按照建议做并添加到我的SWIG defs:

class Handle_Standard_Type {}

我确实摆脱了丑陋的名称,但equals()方法没有注入Java类。

更复杂的是OCC中的大多数类都是使用的 为每个C ++类Example处理一个Handle_Example类。 为了摆脱Java方面的丑陋,occjava项目SWIG定义有很多定义,如:

%rename(Example) Handle_Example;

所以我需要我的解决方案遵循这个命名约定,因此最终生成的Java类需要命名为Handle_Standard_Type而不是Standard_Type

以下是一些更多细节,以防它们相关或可能影响所采取的路径。

以下是OCC中动态类型如何工作的示例,或者更准确地说是如何使用SWIG从Java访问它。

在SWIG中我们有这样的定义:

%{
#include <Geom_Geometry.hxx>
#include <Geom_Plane.hxx>
%}

%rename(Geom_Geometry) Handle_Geom_Geometry;
%rename(Geom_Plane) Handle_Geom_Plane;

%extend Handle_Geom_Geometry {
const Handle_Standard_Type& DynamicType() 
   {
      return (*self)->DynamicType();
   }   
}

class Handle_Geom_Plane: public Handle_Geom_Geometry
{
   Handle_Geom_Plane()=0;
};

%extend Handle_Geom_Plane {
   static const Handle_Standard_Type& STANDARD_TYPE() 
   {
   return STANDARD_TYPE(Geom_Plane);
   }   
}

在上面(*self)->DynamicType()STANDARD_TYPE(Geom_Plane)返回一个表示相关类类型的单例。那里使用了很多宏魔法。

我正在展示这些细节,因为我不确定我的类型地图定义是否与Handle_Standard_Type&相匹配是完全正确的方式,我打算如何最好地处理这个。

最重要的是,在C ++方面,我需要访问STANDARD_TYPE()宏和函数DynamicType返回的值,并将它们在Java端与equals()进行比较,以获得语义等价物C ==

喜欢这个

Geom_Surface aSurface = ....
if (aSurface.DynamicType().equals(Geom_Plane.STANDARD_TYPE())) {
   ....
   }

0 个答案:

没有答案