我有一个现有的库(JPhysX),它是本机C ++库(PhysX)的Java包装器。 Java库使用SWIG生成的类型,例如
,它表示指向C ++代码中com.jphysx.SWIGTYPE_p_NxStream
com.jphysx.SWIGTYPE_p_NxStream
对象的指针。现在我想创建一个继承自C ++类型NxStream
的C ++类,并让我的类的Java包装器也继承自包装器NxStream
。
问题在于,当我调用SWIG为我的类生成包装器时,它还会创建一个名为
的新包装器,它在功能上与com.jphysx.SWIGTYPE_p_NxStream
com.jphysx.SWIGTYPE_p_NxStream
中的包装器相同,但仍然是不同的关于Java的类型。
如何说服SWIG重用
中的现有包装,并使我的类的包装继承自SWIGTYPE_p_NxStream
SWIGTYPE_p_NxStream
?
答案 0 :(得分:1)
使包装类显式继承所需的类型在这种情况下做了诀窍:
%typemap(javabase) UserStream "com.jphysx.SWIGTYPE_p_NxStream";
在包装类中有一些方法与我有类似的问题,但我只是将它们从SWIG接口文件中删除,因为它们无论如何都不会从Java代码中调用。
修改:这不有效。由于包装器类型继承自另一个包装器类型,因此突然有两个 swigCPtr
字段。初始化子类型中的那个,超类型中的那个仍然是0
...但是这是在某处使用超类型时使用的那个。
编辑2 :我终于解决了这个问题,方法是在Java包装器类中添加一个方法,将UserStream
对象转换为SWIGTYPE_p_NxStream
对象:
%typemap(javacode) UserStream %{
public native com.JPhysX.SWIGTYPE_p_NxStream toNxStreamPtr();
%}
这个JNI方法是在SWIG的东西之外手写的:
JNIEXPORT jobject JNICALL Java_physics_UserStream_toNxStreamPtr(JNIEnv *env, jobject userStreamObject) {
jclass userStreamClass = env->GetObjectClass(userStreamObject);
jmethodID getCPtrMethodID = env->GetStaticMethodID(userStreamClass, "getCPtr", "(Lphysics/UserStream;)J");
jlong cPtr = env->CallStaticLongMethod(userStreamClass, getCPtrMethodID, userStreamObject);
jboolean futureUse = false;
jclass nxStreamPtrClass = env->FindClass("com/JPhysX/SWIGTYPE_p_NxStream");
jmethodID nxStreamPtrConstructor = env->GetMethodID(nxStreamPtrClass, "<init>", "(JZ)V");
jobject nxStreamPtrObject = env->NewObject(nxStreamPtrClass, nxStreamPtrConstructor, cPtr, futureUse);
return nxStreamPtrObject;
}