在创建新的SWIG包装器时引用它们

时间:2008-10-31 21:52:42

标签: java c++ swig

我有一个现有的库(JPhysX),它是本机C ++库(PhysX)的Java包装器。 Java库使用SWIG生成的类型,例如com.jphysx.SWIGTYPE_p_NxStream,它表示指向C ++代码中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

1 个答案:

答案 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;
}