Заставить класс-оболочку явно наследовать от желаемого типа добился цели в этом случае:
%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;
}