Fare riferimento ai wrapper SWIG esistenti durante la creazione di nuovi
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
, che rappresenta un puntatore a un oggetto com.jphysx.SWIGTYPE_p_NxStream
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
, che è funzionalmente identico a quello in SWIGTYPE_p_NxStream
, ma comunque un tipo diverso per quanto riguarda Java. com.jphysx
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?
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;
}