在这种情况下,让包装类显式继承所需的类型就可以了:
%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;
}