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
?
从手册中,我真的不知道应该使用哪种类型的地图。
您可以将getCPtr更改为public。你应该把下面的内容放到SWIG接口文件中。
SWIG_JAVABODY_PROXY(public, public, SWIGTYPE) SWIG_JAVABODY_TYPEWRAPPER(public, public, public, SWIGTYPE)
通常想用SWIGTYPE_p_
做任何事情而不是把它当作不透明的类型是一个坏迹象,你应该consider workarounds。
在这个例子中,看起来你想做的就是将它视为一个不透明的类型,只需要一些额外的检查。有几种方法可以实现您直接询问的内容。
最简单的类型映射是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*);
哪个将应用于尚未使用javacode类型映射的每种类型。
通过使用javabody类型映射,我们也可以通过更改访问修饰符来执行您的建议。这次虽然默认情况下已经设置了一个值,所以我们还需要在我们的typemap中提供所有其余的值:
%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
替换任何特定类型的提及,以便类型映射仍然可以合理地应用于许多类型。
这些(以及更多)包含在documentation中。我发现最有助于记住Java类型映射名称和用法的部分是摘要,转载如下:
[ 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 ... }
说完我在这里猜测的所有内容,你的动机实际上是关于Java内的安全检查。如果是这种情况,那么您可能实际上更感兴趣的是生成代码以检查它在使用时是否为空。您可以使用javain
类型映射来实现,特别是使用'pre'选项,它允许您在调用实际发生之前编写一些Java:
%module test
%typemap(javain,pre=" if ($javaclassname.getCPtr($javainput) == 0L) throw new Exception();") SWIGTYPE* "$javaclassname.getCPtr($javainput)"
struct foo;
void bar(foo*);