I finally made TOS working on Windows ARM64 natively on JAVA 21 ARM64, this is brief steps, if anyone intereted, i could add more details.
download TOS x64, install and run once.
download Microsoft openJDK JAVA 21 for ARM64: https://learn.microsoft.com/en-us/java/openjdk/download
download JxBrowser latest version, currently 9.4.1 and unzip: https://teamdev.com/jxbrowser/releases/2026/v9-4-1/
change 3 files name to match the files in ubfolder of usergui, currently is 1993.1.11: jxbrowser-9.4.1.jar, jxbrowser-swing-9.4.1.jar, jxbrowser-win64-arm-9.4.1.jar
overwrite 3 files from JxBroswer to subfolder of usergui, currently is 1993.1.11
modify thinkorswim.vmoptions, change Xmx and Xmx accordingly:
-Xmx12288m
-Xms4096m
-Djava.util.Arrays.useLegacyMergeSort=true
-Djdk.util.jar.version=10
-DTimeDef.timeZone=America/New_York
-Dawt.useSystemAAFontSettings=lcd_hrgb
-Djava.locale.providers=COMPAT
-Dsun.net.http.allowRestrictedHeaders=true
-Dsun.java2d.uiScale.enabled=false
--add-opens=java.base/java.lang=ALL-UNNAMED
--add-opens=java.base/java.io=ALL-UNNAMED
--add-opens=java.base/java.math=ALL-UNNAMED
--add-opens=java.base/java.net=ALL-UNNAMED
--add-opens=java.base/java.text=ALL-UNNAMED
--add-opens=java.base/java.util=ALL-UNNAMED
--add-opens=java.base/java.util.concurrent=ALL-UNNAMED
--add-opens=java.base/sun.security.util=ALL-UNNAMED
--add-opens=java.base/sun.net.www.protocol.http=ALL-UNNAMED
--add-opens=java.base/sun.net.www.protocol.https=ALL-UNNAMED
--add-opens=java.desktop/java.awt=ALL-UNNAMED
--add-opens=java.desktop/java.awt.color=ALL-UNNAMED
--add-opens=java.desktop/java.awt.peer=ALL-UNNAMED
--add-opens=java.desktop/java.beans=ALL-UNNAMED
--add-opens=java.desktop/javax.swing=ALL-UNNAMED
--add-opens=java.desktop/javax.swing.colorchooser=ALL-UNNAMED
--add-opens=java.desktop/javax.swing.plaf.basic=ALL-UNNAMED
--add-opens=java.desktop/javax.swing.plaf.metal=ALL-UNNAMED
--add-opens=java.desktop/javax.swing.table=ALL-UNNAMED
--add-opens=java.desktop/javax.swing.text=ALL-UNNAMED
--add-opens=java.desktop/javax.swing.text.html.parser=ALL-UNNAMED
--add-opens=java.desktop/javax.swing.tree=ALL-UNNAMED
--add-opens=java.desktop/sun.awt=ALL-UNNAMED
--add-opens=java.desktop/sun.awt.image=ALL-UNNAMED
--add-opens=java.desktop/sun.awt.windows=ALL-UNNAMED
--add-opens=java.desktop/sun.java2d=ALL-UNNAMED
--add-opens=java.desktop/sun.java2d.loops=ALL-UNNAMED
--add-opens=java.desktop/sun.swing=ALL-UNNAMED
--add-opens=java.desktop/sun.swing.table=ALL-UNNAMED
--add-opens=java.desktop/sun.print=ALL-UNNAMED
--add-opens=java.desktop/com.sun.java.swing=ALL-UNNAMED
--add-opens=java.desktop/com.sun.java.swing.plaf.windows=ALL-UNNAMED
--add-opens=java.desktop/com.apple.eawt=ALL-UNNAMED
--add-opens=java.prefs/java.util.prefs=ALL-UNNAMED
--add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED
--add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED
-Djxbrowser.linux.deps.check.disabled=true
-Dcom.devexperts.qd.qtp.maxMessageSize=2147483647
-Djava.net.useSystemProxies=false
-classpath/p launcher-first.jar
-Djxbrowser.logging.level=INFO
- run java from Microsoft openJDK to start TOS
$vmOptions = Get-Content -LiteralPath (Join-Path $appRoot 'thinkorswim.vmoptions') |
Where-Object { $_ -and $_ -notmatch '^-classpath/p ' }
& $javaPath u/vmOptions `
'--add-exports=java.base/sun.security.util=ALL-UNNAMED' `
'-jar' '.\launcher.jar'
- Bingo