IME on/off の切換 - その3
JNI の後継である Foreign Function and Memory (FFM) API が、Java 25 から --enable-preview なしで利用可能になった。興味があったので、Swift で書いて動かしていた IME 切換の TISServer を、FFM で書き直す 実験をしてみた。JNI と違い、FFM では dylib を用意しなくても、Carbon を読み込んで、その中の TIS 関連のネイティブ関数を呼び出すことができる。
しかし実際に試してみると、基本的なメソッドは普通に呼び出せたものの、TIS 関連の関数を呼ぶとコアを吐いて強制終了になってしまうことが判明した。条件をいろいろ変えて実験した結果、Swing を使うと TIS 関連の呼び出しができなくなることが判明、どうやら Swing の EDT とネイティブスレッドが干渉しているようであった。
そこで、TIS 関連のコードを、Swing を使わないクラスにまとめて conveyor の cli 化、それを子プロセスとして立ち上げて本体と通信する構造にして、TIS 関連関数を呼び出せるようにした。しかし今度は、子プロセスが Swing を使っていないため、cli の launch が完了せず、ドックでアイコンが永遠にバウンスし続けることになってしまった。これは、無理矢理 RunApplicationEventLoop を呼んで、launch 完了したように擬態することで解決した。
散々苦労した割に、やってることは子プロセス呼び出しなので、Swift で作った今までの TISServer と同じである。ただ、コードが Java で統一されて、IntelliJ と Xcode を行き来しなくてもよくなる利点はあるかもしれない。実験としても楽しかった。
« OpenDolphin: Java 25 / WildFly 38 への移行 | トップページ | IME on/off の切換 - その4 »
「OpenDolphin」カテゴリの記事
- 運用18年目のまとめ(2026.02.07)
- IME on/off の切換 - その5(2026.01.05)
- IME on/off の切換 - その4(2025.12.23)
- IME on/off の切換 - その3(2025.12.20)
- OpenDolphin: Java 25 / WildFly 38 への移行(2025.11.09)


