この場合、ラッパークラスを目的の型から明示的に継承させることでうまくいきました。
%typemap(javabase) UserStream "com.jphysx.SWIGTYPE_p_NxStream";
ラッパークラスには同様の問題が発生したメソッドがいくつかありましたが、Javaコードから呼び出されることはないため、SWIGインターフェイスファイルからそれらを削除しました。
編集:これは機能しません。ラッパータイプは別のラッパータイプを継承しているため、突然2つの swigCPtr
フィールドがあります。サブタイプのものは初期化され、スーパータイプのものは残り0
ます...しかし、これはどこかでスーパータイプを使用するときに使用されるものです。
編集2UserStream
:オブジェクトをオブジェクトに変換するメソッドをJavaラッパークラスに追加することで、最終的に問題を解決しました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;
}