我有一个包含大量内容的头文件,我需要用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中模板化类的特定方法?
答案 0 :(得分:2)
这不是可理解的研究,但您可以重新启用名为yupWantThis
的所有实体。这将包括您的方法。
这应该有效:
%rename("%s") yupWantThis;
但是,它会重新启用所有这样命名的方法/类,并且我不确定这是否适合你。