1

ネイティブ C++ ライブラリ (PhysX) の Java ラッパーである既存のライブラリ (JPhysX) があります。Java ライブラリは、C++ コード内のオブジェクトcom.jphysx.SWIGTYPE_p_NxStreamへのポインタを表すなど、SWIG によって生成された型を使用します。NxStreamここで、C++ type から継承する独自の C++ クラスを作成し、NxStreamクラスの Java ラッパーも wrapper から継承したいと考えていますcom.jphysx.SWIGTYPE_p_NxStream

問題は、自分のクラスのラッパーを生成するために SWIG を呼び出すとSWIGTYPE_p_NxStream、 と呼ばれる新しいラッパーも作成されることです。このラッパーは、 のラッパーと機能的には同じですが、com.jphysxJava に関する限り、タイプが異なります。

この既存のラッパーを再利用して、代わりにcom.jphysxクラスのラッパーを継承させるように SWIG を説得するにはどうすればよいですか?com.jphysx.SWIGTYPE_p_NxStream

4

1 に答える 1

1

この場合、ラッパークラスを目的の型から明示的に継承させることでうまくいきました。

%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;
}
于 2008-11-03T19:07:53.010 に答える