32bit Windows で jnaのNative呼び出しができない
バグ報告ありがとうございます。
再現用コード、ビルド手順まで提示いただけたので、すぐに試すことができました。
Windows 10(64ビット)+ AdoptOpenJDK 8u222 8(32ビット)では事象再現しませんでした。
32ビットWindowsを仮想環境に構築して改めて検証したいと思います。
タイトルのjniをjnaに変更しました。
以前は問題なく実行できていたことを思いだし、以前のバージョンで試してみました。
1.2.0
1.2.1
→問題なし (32/64両方)
1.2.2
1.2.3
1.3.0
以下のエラーが発生 (32/64両方)
sleep start Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/jna/Library at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(Unknown Source) at java.security.SecureClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.access$100(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at NativeTest.main(NativeTest.java:13) Caused by: java.lang.ClassNotFoundException: com.sun.jna.Library at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) ... 13 more
1.3.1
1.4.1と同じ。(32はエラー発生、64は問題なし)
先程のコメントは32bit OSで作成したexeファイルの実行についてでした。
64bit OSで作成したexeファイルについても調査しました。 (NoClassDefFoundErrorが発生する問題は、32bit OSで作成したexeの場合のみのようです。)
1.2.0 ~ 1.2.6
問題なし
1.3.0、1.3.1
1.4.1と同じ。
複数バージョンでの検証・切り分けありがとうございます。大変助かります。
こちらでも、Windows 7(32ビット)を用意することができ、障害事象を再現することができました。
exewrap 1.2.6では問題が発生せず、exewrap 1.3.0では Unable to load library 'kernel32' が発生しました。
yamamさんの推測通り、#39531 と原因が同じようです。
exewrap 1.3.0 ではUWPアプリ対応をおこないました。
UWPアプリはサンドボックスのような閉じた環境で動作するため、
PATH環境変数に基づいたDLLのロードができない仕様になっています。
そのため、UWPアプリではAddDllDirectory関数等を使って明示的にDLLロード可能なパスを指定する必要があります。
exewrap 1.3.0でDLLロード可能なパスを明示的に指定する対応をおこなったのですが、この対応にバグがあり、
UWPアプリ以外でも依存DLLのロード可能パスが制限される(PATH環境変数が使われない)という障害になりました。
具体的には SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_DEFAULT_DIRS) を呼び出していたことが障害要因でした。
現在、#39531 のバグ修正を進めています。
#39531 の修正後、こちらのバグについても事象が改善するか確認したいと思います。
yamamさんが各バージョンで検証してくれたおかげで、1.3.0 の
UWP対応からおかしくなっているようだということに気が付くことができ、それが #39531 解決の手掛かりにもなりました。
本当にありがとうございます。
週末に修正作業を進め、来週前半には状況をご報告できると思います。
exewrap1.4.2pre1で修正されていることを確認しました。 御対応ありがとうございました。
ご確認ありがとうございました。
バージョン 1.4.2 正式版のリリース作業を進めさせていただきます。
#39531と同様かもしれませんが、登録させて頂きます。
環境は以下の通りです。
Windows 7 32ビット
java 8.202
exewrap 1.4.1
以下のNativeTest.javaとMANIFEST.MFを使ってNativeTest.jarを作成し、exewrapでexe化します。
NativeTest.java
MANIFEST.MF
exe化コマンド
このexeを32ビットWindowsで実行すると、以下のエラーが発生します。 同じexeを64ビットWindowsで実行すると、正常に実行できます。
kernel32.dllをc:\windows\system32からコピーしてカレントディレクトリに置くとhs_err_pid8532.logが生成されます。
hs_err_pid8532.log (ユーザ名は置換しています)