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

标签 java c++ swig

我有一个现有的库 (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/

相关文章:

java - 我如何在没有物理打印机的情况下检查我的 java 打印方法是否正常工作

java - int[] 到 List<int> 的类型映射

java - JAXB 为非根元素提供命名空间

java - 使用 Git 和 Eclipse 管理 Android 项目

c++ - 队列 : Strange Output 的数组实现

python - 使用某些 OpenCV 函数时出现段错误

python - 向 Python Swig 模板类添加新方法

python - 如何在带有 Swig 的 Python 中使用 float **?

java - 不能从另一个类调用内部嵌套静态类

C++ libcurl -- 从 ftp 下载 txt 文件并保存为字符串