Ссылки на существующие оболочки SWIG при создании новых

StackOverflow https://stackoverflow.com/questions/255068

  •  05-07-2019
  •  | 
  •  

Вопрос

У меня есть существующая библиотека (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 , которая функционально идентична той, что в com.jphysx , но все же другого типа, что касается Java.

Как я могу убедить 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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top