创建新包装时引用现有的SWIG包装
Referencing existing SWIG wrappers when creating new ones
我有一个现有的库(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;
}
相关文章:
- 元组由 Swig 生成的 Python 包装器返回,用于C++向量
- 使用 Swig 在成员中包装具有互斥锁的 C++ 类时出现问题
- 包装C++函数以使用 SWIG 获取 Lua 字符串表
- 相同的枚举项在 SWIG > 2.0.1 中包装在不同类型的常量中
- 如何在 SWIG 中包装可变参数模板类的可变参数模板成员函数?
- SWIG:将枚举包装为 C#
- 将自定义代码添加到Swig包装器中
- Swig C++ python 包装器文件解释
- 如何将 Python 中的字节对象传递给用 Swig 包装的C++函数
- 使用 SWIG 将C++类包装在 Python 中
- Python目标包装C++类的SWIG错误
- Swig:如何从SwigpyObject获取包装std :: shared_ptr的值
- swig-包装到c#时,没有默认的std ::列表,我该怎么做
- swig:std/multimap.i似乎打破了TCL包装
- SWIG:包装 std::map<key 时编译器错误,val *>
- 如何使用 SWIG 将运算符<<包装为__str__ Python?
- SWIG-包装STD ::一对串时的内存泄漏
- SWIG - 如何使用采用'const double*'的构造函数将类包装为 python
- 使用 SWIG 将 c++ 包装到 java 不满意的链接错误: HeaderJNI.new_Test()J.
- 有没有一个很好的通用方法来用ruby包装swig生成的类