Ссылки на существующие оболочки SWIG при создании новых
Вопрос
У меня есть существующая библиотека (JPhysX), которая является оболочкой Java для собственной библиотеки C ++ (PhysX). Библиотека Java использует типы, сгенерированные SWIG, например,
, который представляет указатель на объект com.jphysx.SWIGTYPE_p_NxStream
NxStream
в код C ++. Теперь я хочу создать свой собственный класс C ++, который наследуется от типа C ++ NxStream
, и иметь оболочку Java для моего класса, также наследуемую от оболочки
com.jphysx.SWIGTYPE_p_NxStream код> код>.
Проблема в том, что когда я вызываю SWIG для создания оболочки для моего класса, он также создает новую оболочку с именем
, которая функционально идентична той, что в SWIGTYPE_p_NxStream
, но все же другого типа, что касается Java. com.jphysx
Как я могу убедить SWIG повторно использовать эту существующую оболочку из com.jphysx
и сделать так, чтобы оболочка моего класса наследовала от
com.jphysx.SWIGTYPE_p_NxStream
код> вместо?
Решение
Заставить класс-обертку явно наследовать от желаемого типа в этом случае добился цели:
%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;
}