2008-10-31 91 views
1

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

的问题是,当我叫痛饮生成我的类包装,还创建了一个名为SWIGTYPE_p_NxStream新的包装,它在功能上等同于一个在com.jphysx,但仍然是一个不同类型的尽可能的Java被关注到。

我该如何说服SWIG重新使用com.jphysx这个现有的包装,并使我的类的包装继承自com.jphysx.SWIGTYPE_p_NxStream而不是?

回答

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方法手写外痛饮的东西:

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