SWIG/java如何向SWIGTYPE*类添加方法
swig生成以下类型的java类: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
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)