From d45153a41c02355598b6f4e3d3c059d43fb09867 Mon Sep 17 00:00:00 2001 From: Julian Chang Date: Sun, 9 Aug 2026 16:23:28 +0700 Subject: [PATCH] add one more check for awt --- .../oneclient_java/assets/java/JavaInfo.class | Bin 2874 -> 3231 bytes .../oneclient_java/assets/java/JavaInfo.java | 12 ++++++ packages/oneclient_java/src/checker.rs | 39 ++++++++++++------ 3 files changed, 39 insertions(+), 12 deletions(-) diff --git a/packages/oneclient_java/assets/java/JavaInfo.class b/packages/oneclient_java/assets/java/JavaInfo.class index 259d2f251a7322d0c373dd52a654c9475b3f4f05..b4d13ae6de0cde5846a4b18dfe3e49ab1cdf651c 100644 GIT binary patch delta 1728 zcmZux*;gB76#sphNoE+PAcHJ{)PNy5NEfR0FoQM_+vK!ABo`?Z4nsi}#y^R?q24GLyT1_jiByyOg`&Rerf~ z=_-KTNUSKcu7-?ZeO#~9Ct{VR5gys2Kt`jA2T;!-lh#MdsElTYG{wdpdbT}s>s4IdqLQfejFzx^r|=s-M%K&qzBP2A*5megZAB`FUw#MCXBFx zAVyS}7`4xc<=qx#<<0b)ri@bznFCfhHmZm9!B8Zrj8fdF9+dGIgQs7QP!1Ur44P^5 zQDm<<;lxjoC}Yb0TlB^sXUIrdC%G|d$#{|>i*)}@AGJ7oaTRA!!=MZp;r@eq%oqTA+{ae&I-i-xi1Pdj-o#rH-c~V(d4{b{Z900@{)j#{WCWwF;c+8kg-1hS z8d~9CDCV<*x_Mh`QAw$9Gd_O11PuyYcvr=Hc%Mi^x%QcQlwi)@3^eudV3nh6knjOR zu9MEua(>ZlS|brFqTm8Pl<<*?kMRjZKKGieidmK!tvXE4?uccldm6JpO@UcC9*RT_ zi@^BY?(y`nRr`BSSGo*FXnE-Qg`Fkk7B3Uoxdezv!~IRksiiK7+!WNIKGjkhIeW-`R(n`Gx{kmqdJ^dCEYpS(7@k9p`wD^q zK@0l>qBiFDEupqdi;!s^YMB=MpU*h=ndClND(W=XJmL41cU4?%6ymjFj=1dtycId( z&U&}ky^g2m;TD!>M7FeXO~MDkwIYJfaE})Lnv=J0MZCJFtmm# zynm(1^I1<_#&keCr_B;LYk0=zxk9qQmF3!VYj}ZLObRbMf}0DstlD`8Rc`9Cw<-DY z>44W$Mq&c5&A}}$&$y}g->LCUvh1My0BAxcn(5Pm4!SFQY5ErZJ4OE|sAb+%A%qPa zg2y4uw1gGYodRRYX=V_afnidO zP*&5)ng&5>Vof}$jEl)_B&XdDn}MxTl8NUzrfz1WcPi)=RG~|^W}2z z#un}8J2y4}wBzbEZKYPVGWgPFVUL}ivNEZ>hB|cXcousY z#MG=cO^+RYjfXVsMUR4B9sAJdRBF1_z3A5wMaZ05OJGG=a~WiXw$i{@x1 zrQ!t!#V&+%W|oXN19*WKb@*|}`AOL2dkF~zM|2#;kh4i_^$lZ0!7DmUj5<*<>Q6EV zMJuOa7~?u7kaoTmn@W?E)htejlbMW)3`706otw^@IddYF_nbM3%bH^BU1$pc|X0}lf*ljVW_J{%<_POtzwpy;Qt@IU~@v}b-adF25sER zB?ruDYbK@Obq3v~#D)4d|-p2`wJZkhUxPs*dJ6+ zN(F2R35L3k=gN5gu(%c#*4##P+=qc`DTCSqw!?>q$@>V2tHCWuEyqd>EDs8_kC7>_o^nm2X}5iuavKeU2ib3knCl!8(jb52+bmIg47Q&{|GfC#k>gsJgX zJV4Af;wd~$7dD0nhN$-`>VB3y^Yng_?&~7Da2nn2kWWCpjYgu-@4t;Y;`I&`m)!sn zT5-7|wmAnROOJyRexWt;#m)VIg@kd!I7viY$6{2zNw&b9O~#q)I7{Pr##^o-apT`p zw+cL)$&!(7%{B9eU`=wOU`s zdp|-ES0M^({Z-xgNP+pg!l@&P0SR&)p$!~$%hW>9x>y&dOvQ?K2?*5gY7BT#@$_+y iZ~9_9AsL^<6S8q4{yh{fe&&kbyDSn}Uy-i{U;hoxgDLX> diff --git a/packages/oneclient_java/assets/java/JavaInfo.java b/packages/oneclient_java/assets/java/JavaInfo.java index 6822b944..10d19de5 100644 --- a/packages/oneclient_java/assets/java/JavaInfo.java +++ b/packages/oneclient_java/assets/java/JavaInfo.java @@ -19,6 +19,7 @@ public final class JavaInfo { System.out.println("java.awt=" + hasClass("java.awt.Toolkit")); System.out.println("java.awt.natives=" + hasAwtNatives()); + System.out.println("java.awt.link=" + awtLinks()); System.out.println("java.jdk=" + hasCompiler()); System.exit(returnCode); @@ -76,6 +77,17 @@ public final class JavaInfo { return false; } + private static boolean awtLinks() { + try { + java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getClass(); + return true; + } catch (LinkageError broken) { + return false; + } catch (Throwable ignored) { + return true; + } + } + private static boolean hasCompiler() { try { return javax.tools.ToolProvider.getSystemJavaCompiler() != null; diff --git a/packages/oneclient_java/src/checker.rs b/packages/oneclient_java/src/checker.rs index 5c413389..f6fd7dc0 100644 --- a/packages/oneclient_java/src/checker.rs +++ b/packages/oneclient_java/src/checker.rs @@ -73,6 +73,7 @@ pub async fn check_java_runtime(absolute_path: String) -> JavaResult JavaResult) -> bool { - probe_flag(info, "java.awt") && probe_flag(info, "java.awt.natives") + probe_flag(info, "java.awt") + && probe_flag(info, "java.awt.natives") + && probe_flag(info, "java.awt.link") } fn probe_flag(info: &HashMap, key: &str) -> bool { @@ -141,21 +144,33 @@ mod tests { assert!(!probe_flag(&info(&[("java.awt", "false")]), "java.awt")); } - #[test] - fn awt_classes_without_their_natives_are_not_usable() { - assert!(!has_usable_awt(&info(&[ - ("java.awt", "true"), - ("java.awt.natives", "false"), - ]))); + fn awt(classes: &str, natives: &str, link: &str) -> HashMap { + info(&[ + ("java.awt", classes), + ("java.awt.natives", natives), + ("java.awt.link", link), + ]) } #[test] - fn awt_needs_both_halves() { - assert!(has_usable_awt(&info(&[ - ("java.awt", "true"), - ("java.awt.natives", "true"), - ]))); + fn a_complete_image_is_usable() { + assert!(has_usable_awt(&awt("true", "true", "true"))); + } + + #[test] + fn awt_classes_without_their_natives_are_not_usable() { + assert!(!has_usable_awt(&awt("true", "false", "true"))); + } + + #[test] + fn natives_that_refuse_to_link_are_not_usable() { + assert!(!has_usable_awt(&awt("true", "true", "false"))); + } + + #[test] + fn every_half_is_required() { assert!(!has_usable_awt(&info(&[("java.awt", "true")]))); assert!(!has_usable_awt(&info(&[("java.awt.natives", "true")]))); + assert!(!has_usable_awt(&info(&[("java.awt.link", "true")]))); } }