1

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

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

我如何说服 SWIG 重用这个现有的包装器com.jphysx并让我的类的包装器继承自com.jphysx.SWIGTYPE_p_NxStream

4

1 回答 1

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;
}
于 2008-11-03T19:07:53.010 回答