2013/11/19

WindowsのJNI経由でcliのオブジェクトを操作する

先日から続けているJNI経由何とかする話の続きです。

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 件のコメント: