Ok, hay una palabra clave que he mantenido intencionalmente lejos de las etiquetas y el título. Eso es "Android", pero eso se debe a que aunque el proyecto está en Android, no creo que mi pregunta tenga nada que ver con eso, y no quiero asustar a personas sin experiencia en Android.SWIG Java Retaining Class información de los objetos que saltan de C++
Por lo tanto, el problema habitual con swig. Tengo un método virtual en una clase de C++, que lo he hecho supercargable en Java agregando la característica director
a la clase y funciona. El problema es que el método recibe un argumento polimórfico que también se extiende en Java, y durante la llamada al método virtual en Java, el objeto viene con toda la información polimórfica eliminada.
Para presentar la situación exacta; Estoy escribiendo un motor de juego en C++, y quiero usarlo felizmente en Java. El motor del juego tiene una clase GameObject
, que registra CollisionListener
sy cuando el motor de colisión detecta un evento de colisión, llama al método collidedWith(GameObject & collidee)
de todos los collisionListener
registrados al pasarlos con el objeto que colisionaron.
class CollisionListener {
public:
virtual bool collidedWith(GameObject &){};
~CollisionListener(){} // I know this needs to be virtual but let's forget about that now
};
estoy exponiendo esta clase, junto con la clase GameObject
a Java utilizando el siguiente archivo de interfaz Bridge.i
%module(directors="1") Bridge
%feature("director") CollisionListener;
%include "CollisionListener";
%feature("director") GameObject;
%include "GameObject.h"
Ahora, cuando heredar de CollisionListener
en Java y la sobrecarga collidedWith
, se consigue de llamada con un objeto java GameObject
lateral. Por ejemplo, si heredo de la clase Java GameObject
y defino una clase Bullet
, cuando esta viñeta colisiona con otro objeto con un detector, en la llamada al método collidedWith
, todo lo que recibo es GameObject
, por lo que (object instanceof Bullet)
no funciona. No es de sorprender, he excavado en la trago generado BridgeJNI.java
y encontramos este:
public static boolean SwigDirector_CollisionListener_collidedWith(CollisionListener self, long arg0) {
return self.collidedWith(new GameObject(arg0, false));
}
Por lo tanto, se ajusta un nuevo objeto alrededor del puntero antes de llamar a las sobrecargas de Java.
Entonces, la pregunta principal es ¿cómo recibir un objeto Bullet
cuando hay una colisión?
He encontrado una manera de lograrlo fácilmente, pero tengo que modificar los archivos generados automáticamente, lo cual es una mala idea. Así que estoy esperando que algún maestro de tragos me ayude a inyectar las modificaciones en los archivos generados por el trago.
Mi pequeño truco es mantener un jobject * self
en cada objeto de C++ lado GameObject
, y asigne la dirección del objeto java real durante la construcción de la banda de Real Java GameObject
(y no el que meramente se ajusta el puntero). De esta forma, podría definir un método polimórfico getSelf
en el lado C++ GameObject
y utilizar el resultado felizmente en java. ¿Hay alguna forma de inyectar el código necesario en los archivos generados swig?
Gracias
Nota: Si ha intentado directores en Android y no han trabajado, es porque la versión estable actual no lo soporta. Descarga el Bleeding Edge del sitio web de swig. Pero escribo esto el 22/03/2012 y esta nota pronto será innecesaria. La razón por la cual el destructor no es virtual es porque la versión de Bleeding Edge hace que el programa falle en el destructor, y hacerlo no virtual parece mantenerlo bajo control por el momento.
Entonces, ¿la versión corta de su pregunta es que quiere (por ejemplo) derivar 'GameObject' en Java y aún poder lanzar dentro de Java cuando ese tipo derivado pasa a una implementación Java de' collidedWith'? Seguro que tu pequeño truco puede ser envuelto en un mapa de tipos si ese es el caso. – Flexo
¡Exactamente! Pensé que el trago tendría una forma de inyectar código, pero soy bastante nuevo para tragar. Comprobaré los mapas de tipos. – enobayram
Voy a escribir una respuesta mañana con suerte entonces. – Flexo