gpt4 book ai didi

java - 在创建新的 SWIG 包装器时引用现有的 SWIG 包装器

转载 作者:太空宇宙 更新时间:2023-11-04 12:28:55 27 4
gpt4 key购买 nike

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

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

我如何说服 SWIG 重用 com.jphysx 中的现有包装器并使我的类的包装器继承自 <code>com.jphysx.SWIGTYPE_p_NxStream</code>相反?

最佳答案

在这种情况下,使包装器类显式继承所需的类型就成功了:

%typemap(javabase) UserStream "com.jphysx.SWIGTYPE_p_NxStream";

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

编辑:这有效。由于包装器类型继承自另一个包装器类型,它突然具有两个 swigCPtr 字段。子类型中的那个被初始化,父类(super class)型中的那个仍然是 0...但这是当您在某处使用父类(super class)型时使用的那个。

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

关于java - 在创建新的 SWIG 包装器时引用现有的 SWIG 包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/255068/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com