SWIG/java如何向SWIGTYPE*类添加方法

SWIG/java如何向SWIGTYPE*类添加方法,java,code-generation,swig,Java,Code Generation,Swig,swig生成以下类型的java类: public class SWIGTYPE_p_my { private long swigCPtr; protected SWIGTYPE_p_my(long cPtr, boolean futureUse) { swigCPtr = cPtr; } protected SWIGTYPE_p_my() { swigCPtr = 0; } protected static long getCPtr(SWIGTYPE

swig生成以下类型的java类:

public class SWIGTYPE_p_my {
  private long swigCPtr;

  protected SWIGTYPE_p_my(long cPtr, boolean futureUse) {
    swigCPtr = cPtr;
  }

  protected SWIGTYPE_p_my() {
    swigCPtr = 0;
  }

  protected static long getCPtr(SWIGTYPE_p_my obj) {
    return (obj == null) ? 0 : obj.swigCPtr;
  }
}
我想知道swigCPtr是否为null/0,但这些方法受到保护。有没有一个简单的方法 添加一些方法,如:

public boolean isNull() { return swigCPtr==0L;}
或者将getCPtr更改为
公共


从手册中,我真的不知道我应该使用哪种类型的类型映射。

通常想要对
SWIGTYPE\u p\ucode>做任何事情,而不是将其视为不透明类型是一个坏迹象,你应该这样做

在本例中,看起来您只需将其视为不透明类型,只需进行一些额外的检查。有几种方法可以直接实现您的要求

使用的最简单类型映射是
javacode
,它在Java公开的每个类型中插入一次,默认为空。所以我们可以写:

%module test

%typemap(javacode) foo* %{
  public boolean isNull() {
    return swigCPtr == 0L; 
  }
%}

struct foo;

void bar(foo*);
为了更加通用,我们可以编写应用于
SWIGTYPE*
的类型映射,其中在搜索要应用的类型映射时,SWIGTYPE被用作任何其他不匹配类型的占位符。(提示:调用SWIG时,可以使用
-debug tmsearch
查看要检查的类型映射)

因此,我们可以编写以下内容:

%module test

%typemap(javacode) SWIGTYPE* %{
  public boolean isNull() {
    // Test 2
    return swigCPtr == 0L; 
  }
%}

struct foo;

void bar(foo*);
它将应用于尚未使用JavaCodeTypeMaps的每个类型

我们还可以按照您的建议,使用javabody类型映射来更改access修饰符。虽然这一次默认情况下已经设置了一个值,但是我们还需要在类型映射中提供所有其余的值:

%module test

%typemap(javabody) SWIGTYPE* %{
  private long swigCPtr;

  protected $javaclassname(long cPtr, boolean futureUse) {
    swigCPtr = cPtr;
  }

  protected $javaclassname() {
    swigCPtr = 0;
  }

  public static long getCPtr($javaclassname obj) {
    return (obj == null) ? 0 : obj.swigCPtr;
  }
%}

struct foo;

void bar(foo*);
其中,代码主要是从检查通常生成的输出中提取出来的,但是用替换
$javaclassname
替换对特定类型的任何提及,这样类型映射仍然可以合理地应用于许多类型

这些(以及更多)将在中介绍。我发现最有助于记住Java typemap名称和用法的部分是摘要,如下所示:


说到这里,我想你的动机其实是Java内部的安全检查。如果是这种情况,那么您实际上可能更感兴趣的是生成代码来检查它在使用时是否为null。您可以使用
javain
typemap来实现这一点,特别是使用“pre”选项,它允许您在调用实际发生之前编写一点Java:

%module test

%typemap(javain,pre="    if ($javaclassname.getCPtr($javainput) == 0L) throw new Exception();") SWIGTYPE* "$javaclassname.getCPtr($javainput)"

struct foo;

void bar(foo*);

您可以将getCPtr更改为public。您应该将以下内容放入SWIG接口文件中

SWIG_JAVABODY_PROXY(public, public, SWIGTYPE) SWIG_JAVABODY_TYPEWRAPPER(public, public, public, SWIGTYPE) SWIG_JAVABODY_代理(public、public、SWIGTYPE) SWIG_JAVABODY_TYPEWRAPPER(public、public、public、SWIGTYPE) 这里的答案是:是相关的,但对于具体的案例,有一个更简洁更具体的解决方案,我稍后会尝试写出来。 SWIG_JAVABODY_PROXY(public, public, SWIGTYPE) SWIG_JAVABODY_TYPEWRAPPER(public, public, public, SWIGTYPE)