せっかなくので、やってみた。

日々のあんなこと、こんなこと、せっかくなのでやってみた

XEiJ ver0.19.12.15 がJDK13で動かないのでJDK11でコンパイルしなおしてみた。(解消しました)

javaで動作する唯一のX680x0エミュレータであるkamada大先生のXEiJですが、JDK13の環境に対応した最新のver0.19.12.15が私の環境では以下のエラーで起動しませんでした。

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ffe8380f98a, pid=25780, tid=18720
#
# JRE version: OpenJDK Runtime Environment (13.0.2+8) (build 13.0.2+8)
# Java VM: OpenJDK 64-Bit Server VM (13.0.2+8, mixed mode, sharing, tiered, compressed oops, g1 gc, windows-amd64)
# Problematic frame:
# C  [awt.dll+0x8f98a]
#
# No core dump will be written. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# C:\hogehoge\hs_err_pid25780.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.java.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#

原因がわからず、長らくJDK11で動作するひとつ前のバージョン(0.19.01.24)を使っていましたがふと思い立って最新のJDK13.0.2+8や、JDK15.0.1で動かしてみても結果は同じでした。> <
うーん、ネットには動作しないなんて情報は無いので私の環境だけなのか。。。
hs_err_pid25780.logを見ろと出ているので、中身を見てみましたが、よく分からないながらもスタックトレースには

 914 Event: 0.099 Thread 0x0000019034a8c800 Exception <a 'java/lang/ClassNotFoundException'{0x0000000711f52be0}: sun/awt/resources/spi/awtProvider> (0x0000000711f52be0)

という出力があったので、AWT回りのクラスが見つからないのかなーと。
このエラーメッセージを検索すると、AWTのバグっぽい記述がいくつか見つかりました。

bugs.java.com

アーカイブに含まれているXEiJ.jarと実行しているJDK13のバージョンの差異によるものかと思い、kamada先生のサイトに掲載されいてるコンパイル手順でビルドしてみましたがJDK13を使ってビルドしてもエラー解消されませんでした。
ちなみにコンパイル手順はこちら。DOSCygwin、はたまたPowerShellのビルド手順が記載されていてとても親切です。

stdkmd.net

しかし、ダメもとでJDK11を使ってコンパイルしたところ、コンパイル/起動まで成功しました!
「XEiJ のコンパイルと実行に JDK 13.0.1 GA Release を使います。」と明記されているので、使っていたら落ちてしまう可能性がありますが、 今のことろ動作しています。

2020.12.6追記
恐れ多くも直接ご本人にお伺いしたところ、セキュリティの懸念もあるので、JDKは常に最新版を用いることをお勧めするとの事でしたので、 上記は推奨される対応方法ではありません。

上記のサイトまんまですが、コンパイル手順を記載します。(Cygwinを使っているのでその前提で。)

export JAVA_HOME=/hogehoge/jdk-11
export PATH=$JAVA_HOME/bin:$PATH
java -version
  Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
  openjdk version "11" 2018-09-25
  OpenJDK Runtime Environment 18.9 (build 11+28)
  OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)

cd XEiJ
rm -f class/xeij/*.class
javac -encoding UTF-8 -d class xeij/*.java -Xlint:all -Xlint:-serial -Xlint:-fallthrough -Xdiags:verbose
rm -f XEiJ.jar
jar cfe XEiJ.jar xeij.XEiJ -C class . -C . xeij/IPLROM.DAT xeij/IPLROMXV.DAT xeij/IPLROMCO.DAT xeij/IPLROM30.DAT xeij/CGROM_XEiJ.DAT xeij/HUMAN.SYS xeij/COMMAND.X xeij/license_XEiJ.txt xeij/license_FSHARP.txt xeij/license_MAME.txt

java -jar /hogehoge/XEiJ/XEiJ.jar

2020.12.9追記
原因が分かりました。
XEiJ起動時に、環境変数 JAVA_TOOL_OPTIONS に -Dfile.encoding=UTF-8 をセットしていると発生し、上記の値を削除したところ、問題無く起動しました。
どうもこちらに記載されいているバグの様です。

bugs.java.com

なぜ自分の環境でJAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 をセットしていたか覚えていないのですが、しばらくこのオプションは削除して使用してみたいと思います。
尚、ページに記載されている 11.0.10-oracle は無償サポートでは入手できないっぽいので、jdk15、jdk16の今後のリリースで解消されると思われます。 これで最新のXEiJが使えるようになりました。