gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:22:19 31 4
gpt4 key购买 nike

我有一个包含大量内容的头文件,我只需要从 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 接口(interface)文件:

%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 中模板化类的特定方法?

最佳答案

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

这应该有效:

%rename("%s") yupWantThis;

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

关于java - 如何取消忽略 SWIG 中模板化类的特定方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27417884/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com