SWIG を使用して C++ ライブラリの Java ラッパーを作成しようとしています。Java プログラミング環境内で必要なすべての機能を取得するには、ディレクタが必要です。より具体的には、Java ユーザーが私の C++ クラスから継承し、特定のメソッドを実装できるようにする必要があります。特に、実装する必要があるメソッドの 1 つは、何らかのclone()
メソッドです。
C++ では、ユーザー実装によってオブジェクト ポインターが提供されますBase*
。このポインタは、ライブラリ自体によって管理されます。
Base* Derived::clone() {
return new Derived(*this);
}
Java ラッパーに関して私が抱えている問題は、Java プロキシ クラスが対応する C++ ディレクター クラスの管理をデフォルトでBase
取得することです。SwigDirector_Base
これは確かに一般的なケースには適していますが、この特定のユーザー定義clone()
関数には適していません。
私の個人的な制約は、私の C++ ライブラリの Java ラッパーは Java 固有のコードを使用しないため、ユーザー実装は次のようになるはずです。
class Derived {
...
Base clone() {
return new Derived(this);
}
}
これまでのところ、それを機能させ、コピーされた Java インスタンスのガベージ コレクションを回避するために、http: //www.swig.org/Doc2.0/SWIGDocumentation.html#CSharp_memory_management_member_variables に記載されているトリックを使用しました。
そして、JavaDerived
クラスが対応する C++ ディレクタ クラスを決して削除しないようにするために、C++ ラッパー コードからコピーされたインスタンスの Java cMemOwn フラグの値を設定するためにSwigDirector_Base
使用しました。%typemap(directorout)
SwigDirector_Base::clone()
Base
コピー メソッドであるかどうかにかかわらず、クラスへのポインターを返すすべてのメソッドに適用されるため、このソリューションにはあまり満足していません...
関数固有の方法でこれを行う方法について何か考えはありますか? それとも他の方法で?