首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >创建新的SWIG包装器时引用现有SWIG包装器

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

Stack Overflow用户
提问于 2008-10-31 21:52:42
回答 1查看 614关注 0票数 1

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2008-11-03 19:07:53

在这种情况下,让包装器类显式地继承所需的类型可以做到这一点:

代码语言:javascript
运行
复制
%typemap(javabase) UserStream "com.jphysx.SWIGTYPE_p_NxStream";

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

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

JavaEdit2Java:我最终解决了这个问题,向包装器类添加了一个方法,将UserStream对象转换为SWIGTYPE_p_NxStream对象:

代码语言:javascript
运行
复制
%typemap(javacode) UserStream %{
    public native com.JPhysX.SWIGTYPE_p_NxStream toNxStreamPtr();
%}

这个JNI方法是在SWIG的东西之外手写的:

代码语言:javascript
运行
复制
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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/255068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档