如何取消忽略SWIG中模板化类的特定方法?

时间:2014-12-11 07:57:54

标签: java c++ java-native-interface swig

我有一个包含大量内容的头文件,我需要用Java调用其中的几个 - 这是我做的一个例子(当然真正的一个是怪物,我不能把它拆分为它由第三方提供):

#ifndef _HIDING_H_
#define _HIDING_H_

template<class T> class SomeClassIWant {
public:
    void yupWantThis();
    T nopeDoNoWantThis();
};

class SomeClassIDoNotWant {
public:
    void definatelyDoNotWantToCallThisFromJava();
};

SomeClassIWant<int> createTheClassIWant();

#endif

我想,因此SWIG 3.0.2可以很好地为我做好工作,所以我创建了以下SWIG接口文件:

%module hiding;

%ignore "";

%rename("%s") createTheClassIWant; 
%rename("%s") SomeClassIWant;
%rename(IntSomeClassIWant) SomeClassIWant<int>; 
%rename("%s") SomeClassIWant<int>::yupWantThis;

%{
#include "hiding.h"
%}

%include "hiding.h"

%template(IntSomeClassIWant) SomeClassIWant<int>;

我跑了swig(swig -c++ -java hiding.i)并列出了*.java个文件:

hiding.java
hidingJNI.java
IntSomeClassIWant.java

好的,所以忽略一切并且忽略我想要的东西似乎已经奏效了,除了美中不足之处......

IntSomeClassIWant.java文件中包含以下内容:

/* ----------------------------------------------------------------------------
 * This file was automatically generated by SWIG (http://www.swig.org).
 * Version 3.0.2
 *
 * Do not make changes to this file unless you know what you are doing--modify
 * the SWIG interface file instead.
 * ----------------------------------------------------------------------------- */
public class IntSomeClassIWant {
  private long swigCPtr;
  protected boolean swigCMemOwn;

  protected IntSomeClassIWant(long cPtr, boolean cMemoryOwn) {
    swigCMemOwn = cMemoryOwn;
    swigCPtr = cPtr;
  }

  protected static long getCPtr(IntSomeClassIWant obj) {
    return (obj == null) ? 0 : obj.swigCPtr;
  }

  public synchronized void delete() {
    if (swigCPtr != 0) {
      if (swigCMemOwn) {
        swigCMemOwn = false;
        throw new UnsupportedOperationException(
             "C++ destructor does not have public access");
      }
      swigCPtr = 0;
    }
  }

  public IntSomeClassIWant() {
    this(hidingJNI.new_SomeClassIWant(), true);
  }
}

我没有 yupWantThis 方法 - 我想到我用行%rename("%s") SomeClassIWant<int>::yupWantThis;忽略了它,但似乎没有。

尽我所能,我无法弄清楚如何让这个方法可见 - 也许我需要在%template行或某事做某事,我感到很沮丧,所以......

如何取消忽略SWIG中模板化类的特定方法?

1 个答案:

答案 0 :(得分:2)

这不是可理解的研究,但您可以重新启用名为yupWantThis的所有实体。这将包括您的方法。

这应该有效:

%rename("%s") yupWantThis;

但是,它会重新启用所有这样命名的方法/类,并且我不确定这是否适合你。