我有一个现成的库(JPhysX),它是本机C++库(PhysX)的Java包装器。Java库使用SWIG生成的类型,例如com.jphysx.SWIGTYPE_p_NxStream
,它在C++代码中表示指向NxStream
对象的指针。现在,我想创建我自己的C++类,该类继承自C++类型NxStream
,并且我的类的Java包装器也继承自包装器com.jphysx.SWIGTYPE_p_NxStream
。
问题是,当我调用SWIG为我的类生成包装器时,它还创建了一个名为SWIGTYPE_p_NxStream
的新包装器,它在功能上与com.jphysx
中的包装器相同,但就Java而言,它仍然是一种不同的类型。
我如何才能说服SWIG重用com.jphysx
中的现有包装器,并使我的类的包装器继承自com.jphysx.SWIGTYPE_p_NxStream
?
发布于 2008-11-03 19:07:53
在这种情况下,让包装器类显式地继承所需的类型可以做到这一点:
%typemap(javabase) UserStream "com.jphysx.SWIGTYPE_p_NxStream";
包装器类中有一些我遇到过类似问题的方法,但我只是从SWIG接口文件中删除了它们,因为它们无论如何都不会从Java代码中调用。
编辑:这不起作用。由于包装器类型继承自另一个包装器类型,因此它突然有了两个swigCPtr
字段。子类型中的那个被初始化,父类型中的那个仍然是0
...但这是当你在某处使用超类型时会用到的。
JavaEdit2Java:我最终解决了这个问题,向包装器类添加了一个方法,将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;
}
https://stackoverflow.com/questions/255068
复制相似问题