[OK]を、私は意図的にタグとタイトルから離してきたキーワードがあります。それは「Android」ですが、それはプロジェクトがAndroidにあるにもかかわらず、私の質問はそれと関係がないと思うし、Androidの経験がない人を恐れたくないからです。SWIG Java C++からバウンスするオブジェクトのクラス情報を保持
だから、swigの通常の問題です。私はクラスにdirector
機能を追加することで、Javaでオーバーロード可能にしたC++クラスの仮想メソッドを持っています。問題は、このメソッドがJava側でも拡張された多相引数を受け取り、Javaの仮想メソッド呼び出し中にオブジェクトにすべての多型情報が取り除かれていることです。
正確な状況を提示するには、私はC++でゲームエンジンを作っています。私はそれをJavaで楽しく使いたいと思っています。ゲームエンジンはGameObject
クラスを持ち、CollisionListener
を登録します。衝突エンジンが衝突イベントを検出すると、collidedWith(GameObject & collidee)
のすべての登録済みメソッド(collisionListener
)が衝突したオブジェクトを渡します。私は、Javaと過負荷collidedWith
にCollisionListener
から継承したときに
class CollisionListener {
public:
virtual bool collidedWith(GameObject &){};
~CollisionListener(){} // I know this needs to be virtual but let's forget about that now
};
は、私は、次のインターフェイスファイルBridge.i
%module(directors="1") Bridge
%feature("director") CollisionListener;
%include "CollisionListener";
%feature("director") GameObject;
%include "GameObject.h"
今
を使用してJavaにGameObject
クラスと一緒に、このクラスを露出してる、それが呼ばれるのを取得しますJava側ではGameObject
オブジェクトです。たとえば、GameObject
クラスから継承してクラスを定義すると、この呼び出しがリスナーを持つ別のオブジェクトと衝突したときに、collidedWith
メソッド呼び出しで、私が受け取るものはすべてGameObject
なので、(object instanceof Bullet)
は機能しません。私はSWIGに掘ってきた驚き、何がBridgeJNI.java
を生成しないと、この発見:だから、それはJavaのオーバーロードを呼び出す前にポインタの周りに新しいオブジェクトをラップ
public static boolean SwigDirector_CollisionListener_collidedWith(CollisionListener self, long arg0) {
return self.collidedWith(new GameObject(arg0, false));
}
を。
したがって、主な問題は、衝突が発生したときにBullet
オブジェクトを受け取る方法です。
私は簡単にそれを達成する方法を考え出しましたが、自動生成されたファイルを修正する必要があります。これは悪い考えです。だから私はいくつかのswig masterがswigで生成されたファイルに変更を加えるのを助けることを望んでいます。
私の小さなハックは、すべてのC++側GameObject
オブジェクトにjobject * self
を維持し、実際のJava側GameObject
(単にポインタをラップしていない1)の建設中に実際のJavaオブジェクトのアドレスを割り当てることです。このようにして、C++側で多形のgetSelf
メソッドを定義し、GameObject
をJavaでうまく使用することができます。 swig生成ファイルに必要なコードを挿入する方法はありますか?
おかげ
注:あなたは、Android上で取締役を試してみましたが、彼らは働いていない場合は、現在の安定版がそれをサポートしていないので、それはです。 swigウェブサイトからBleeding Edgeをダウンロードしてください。しかし、私は22/03/2012にこれを書いています。このメモは間もなく不要になります。デストラクタが仮想ではない理由は、Bleeding Edgeのバージョンがデストラクタでプログラムをクラッシュさせ、非バーチャルにすると、今のところそれを制御しているように見えるからです。
Javaの 'GameObject'を派生させ、その派生型が' collidedWith'のJava実装に渡されたときに、Javaでキャストできるようにしたいと思っていますか?そうであれば、あなたの小さなハックをタイプマップにラップすることができます。 – Flexo
正確に!私はswigがコードを挿入する方法を持っていると思っていましたが、私は泳ぐのがとても新しいです。私はタイプマップをチェックします。 – enobayram
明日はうまくいけば答えを書きます。 – Flexo