创建新包装时引用现有的SWIG包装

Referencing existing SWIG wrappers when creating new ones

本文关键字:包装 SWIG 引用 新包装 创建      更新时间:2023-10-16

我有一个现有的库(JPhysX),它是本机C++库(PhysX)的Java包装器。Java库使用SWIG生成的类型,例如com.jphysx.SWIGTYPE_p_NxStream,它表示指向C++代码中NxStream对象的指针。现在,我想创建自己的继承自C++类型NxStream的C++类,并使我的类的Java包装器也继承自包装器com.jphysx.SWIGTYPE_p_NxStream

问题是,当我调用SWIG为我的类生成包装器时,它还创建了一个名为SWIGTYPE_p_NxStream的新包装器,它在功能上与com.jphysx中的包装器相同,但就Java而言,它仍然是不同的类型。

我如何说服SWIG重用com.jphysx中现有的包装器,并使我的类的包装器继承com.jphysx.SWIGTYPE_p_NxStream

在这种情况下,让包装器类显式继承所需的类型起到了关键作用:

%typemap(javabase) UserStream "com.jphysx.SWIGTYPE_p_NxStream";

包装器类中有一些方法遇到了类似的问题,但我只是从SWIG接口文件中删除了它们,因为无论如何都不会从Java代码中调用它们。

编辑:这不起作用。由于包装器类型继承自另一个包装器类型,因此它突然具有两个swigCPtr字段。子类型中的一个被初始化,超类型中的那个仍然是0。。。但当你在某个地方使用超类型时,就会用到这个。

Edit 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;
}