Ссылки на существующие оболочки SWIG при создании новых - PullRequest
1 голос
/ 01 ноября 2008

У меня есть существующая библиотека (JPhysX), которая является оболочкой Java для собственной библиотеки C ++ (PhysX). Библиотека Java использует типы, сгенерированные SWIG, например, <code>com.jphysx.SWIGTYPE_p_NxStream, который представляет указатель на объект NxStream в коде C ++. Теперь я хочу создать свой собственный класс C ++, который наследуется от типа C ++ NxStream, и иметь оболочку Java для моего класса, также наследуемую от оболочки <code>com.jphysx.SWIGTYPE_p_NxStream.

Проблема в том, что когда я вызываю SWIG для создания оболочки для моего класса, он также создает новую оболочку с именем <code>SWIGTYPE_p_NxStream, которая функционально идентична той, что в <code>com.jphysx, но все же другой тип, что касается Java.

Как я могу убедить SWIG повторно использовать эту существующую оболочку из com.jphysx и сделать так, чтобы оболочка моего класса наследовала от <code>com.jphysx.SWIGTYPE_p_NxStream вместо этого?

1 Ответ

1 голос
/ 03 ноября 2008

Заставить класс-оболочку явно наследовать от желаемого типа добился цели в этом случае:

%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 был написан от руки 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;
}
...