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

时间:2014-06-11 15:01:49

标签: 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_p_my obj) {
    return (obj == null) ? 0 : obj.swigCPtr;
  }
}

我想知道swigCPtr是否为null / 0但方法是受保护的。有一个简单的方法 添加一些方法,如:

public boolean isNull() { return swigCPtr==0L;}

或将getCPtr更改为public

从手册中,我并没有真正得到我应该使用的 typemap

2 个答案:

答案 0 :(得分:0)

除了将SWIGTYPE_p_视为不透明类型之外,通常希望对javacode执行任何操作都是一个不好的标志,您应该consider workarounds

在这个例子中,看起来你要做的就是将它视为一个不透明的类型,只需要一些额外的检查。有几种方法可以实现您直接询问的内容。

要使用的最简单的类型映射是%module test %typemap(javacode) foo* %{ public boolean isNull() { return swigCPtr == 0L; } %} struct foo; void bar(foo*); ,它会在Java暴露的每种类型中插入一次,默认为空。所以我们可以写:

SWIGTYPE*

虽然我们可以编写应用于-debug-tmsearch的类型映射,但更为通用,其中SWIGTYPE在搜索要应用的类型映射时用作任何其他不匹配类型的占位符。 (提示:您可以在调用SWIG时使用%module test %typemap(javacode) SWIGTYPE* %{ public boolean isNull() { // Test 2 return swigCPtr == 0L; } %} struct foo; void bar(foo*); 来查看正在检查哪些类型图。)

所以我们可以写下以下内容:

%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*);

这将适用于尚未使用javacode类型映射的每种类型。

通过使用javabody typemap,我们也可以通过更改访问修饰符来完成您的建议。这次虽然默认情况下已经设置了一个值,但我们也需要在我们的类型图中提供所有其余的值:

$javaclassname

代码主要来自检查通常会生成的输出,但用替换[ javaimports typemap ] [ javaclassmodifiers typemap ] javaclassname extends [ javabase typemap ] implements [ javainterfaces typemap ] { [ javabody or javabody_derived typemap ] [ javafinalize typemap ] public synchronized void delete() [ javadestruct OR javadestruct_derived typemap ] [ javacode typemap ] ... proxy functions ... } 替换任何特定类型的提及,以便类型映射仍然可以合理地应用于许多类型。

这些(及更多)包含在documentation中。我发现最有助于记住Java类型映射名称和用法的部分是摘要,转载如下:

javain

说完所有我在这里猜测你的动机真的是关于Java内的安全检查。如果是这种情况,那么您实际上可能更感兴趣的是生成代码以检查它在使用时是否为空。您可以使用%module test %typemap(javain,pre=" if ($javaclassname.getCPtr($javainput) == 0L) throw new Exception();") SWIGTYPE* "$javaclassname.getCPtr($javainput)" struct foo; void bar(foo*); 类型图执行此操作,尤其是使用' pre'允许您在调用实际发生之前编写一点Java的选项:

{{1}}

答案 1 :(得分:0)

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

  SWIG_JAVABODY_PROXY(public, public, SWIGTYPE)
  SWIG_JAVABODY_TYPEWRAPPER(public, public, public, SWIGTYPE)