C#.exe → win32.dll → Java.jar → c++/cli.dllときまして。
cliのオブジェクトを操作する段階まで来ました。
ところが、cliのオブジェクトってC++のポインタみたいに数値で記憶しておく、ってことができないのですね。
最初の目論見ではJavaのクラスにネイティブのポインタを保存するint型のフィールドでも作って管理しておけばいいんじゃね?
くらいに考えていたのですが。
見事にその目論見は達成できなくなってしまったのです orz
しかしまあ、ここまでやってきたので何とかしたいところ。
結局、以下のようにして逃げました。
- cliで操作するオブジェクトと関連付くJavaのオブジェクトにはGuid→文字列のフィールドを追加しておく
- JNI突入前にDictionary<String^,Object^>^のオブジェクトを作り、GC::KeepAliveしておく
- Javaオブジェクト内のGuid文字列をキーにして前項のDictionaryにcliオブジェクトを入れる
- Javaオブジェクトのfinalize時にcliオブジェクトをDictionaryから削除
正しいかどうかは別にして、とりあえずこのやり方で動いています。
画像をうにゃうにゃするんですが、androidとc++/cliの今のクラス対比は以下のように。
- android.graphics.Bitmap ⇔ System.Drawing.Bitmap
- android.graphics.Canvas ⇔ System.Drawing.Graphics
- android.graphics.Paint ⇔ System.Drawing.Pen
まだ、Typefaceとかあるんですが、これはSystem.Drawing.Grahicsに吸収させるかな。
あ、C++/cliなので、上の表記はSystem::とかになるんですが、Drawingの部分でのマークに自動変換してくれやがりまして。
普段使ってるC#式の表記になってます。
(愛用のツールは、Windows Live Writerです)
0 件のコメント:
コメントを投稿