Domanda

Ho una libreria esistente (JPhysX) che è un wrapper Java per una libreria C ++ nativa (PhysX). La libreria Java utilizza i tipi generati da SWIG, ad esempio com.jphysx.SWIGTYPE_p_NxStream , che rappresenta un puntatore a un oggetto NxStream in il codice C ++. Ora voglio creare la mia classe C ++ che eredita dal tipo C ++ NxStream e che anche il wrapper Java per la mia classe erediti dal wrapper com.jphysx.SWIGTYPE_p_NxStream .

Il problema è che quando chiamo SWIG per generare il wrapper per la mia classe, crea anche un nuovo wrapper chiamato SWIGTYPE_p_NxStream , che è funzionalmente identico a quello in com.jphysx , ma comunque un tipo diverso per quanto riguarda Java.

Come posso convincere SWIG a riutilizzare questo wrapper esistente da com.jphysx e fare in modo che il wrapper della mia classe erediti da com.jphysx.SWIGTYPE_p_NxStream invece?

È stato utile?

Soluzione

Rendere la classe wrapper esplicitamente ereditata dal tipo desiderato ha fatto il trucco in questo caso:

%typemap(javabase) UserStream "com.jphysx.SWIGTYPE_p_NxStream";

Esistono alcuni metodi nella classe wrapper con i quali ho riscontrato problemi simili, ma li ho semplicemente rimossi dal file di interfaccia SWIG perché non verranno comunque richiamati dal codice Java.

Modifica : questo non funziona. Poiché il tipo di wrapper eredita da un altro tipo di wrapper, improvvisamente ha due swigCPtr . Quello nel sottotipo è inizializzato, quello nel supertipo rimane 0 ... ma questo è quello che viene utilizzato quando si utilizza il supertipo da qualche parte.

Modifica 2 : ho finalmente risolto il problema, aggiungendo un metodo alla classe wrapper Java per convertire l'oggetto UserStream in un SWIGTYPE_p_NxStream oggetto:

%typemap(javacode) UserStream %{
    public native com.JPhysX.SWIGTYPE_p_NxStream toNxStreamPtr();
%}

Questo metodo JNI è stato scritto a mano al di fuori delle cose di 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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top