STM32CubeMx在JDK14环境中的使用

STM32CubeMx在JDK14环境中的使用

前景

最近在学习Stm32,装了STM32CubeMX,但在我生成MDk项目时出现了

百度发现这是两个两种原因造成:

  1. 项目含有中文路径
  2. 没有使用jdk8
  3. 用老版本CubeMX(挺老的版本)

我是后者,但是平常写IDEA写Java项目时,又用到了JDK14。一开始我是百度

Java 多版本共存

查到了如图解决方案但是在使用 %JAVA_HOME8% 环境变量时,依旧出现问题,用资源管理器查看javaw.exe发现他依旧调用的是jdk14环境下的javaw.exe。
迫不得已,我只能在使用STM32CubeMX时卸载JAVA解决问题,但每次重新安装JDK14都嫌累orz

灵感来源

以前玩WOT时特别想要其登录界面的背景视频,于是接触了process explorer这款软件,昨天我突发奇想,用这款软件能不能查看为什么在JDK8的环境下cubemx依旧用jdk14运行。果然,我发现了这个玩意,那就简单了,我当即写了个cmd脚本

1
"C:\Program Files\Java\jdk1.8.0_271\bin\javaw.exe" -classpath "D:\Program Files\STMicroelectronics\STM32Cube\STM32CubeMX\STM32CubeMX.exe;anything" com.st.microxplorer.maingui.STM32CubeMX

问题解决

根治问题

解决了问题非常兴奋,但是,今早用keil时对这个编辑器越用越烦(破代码提示),JetBrains全家桶不香吗,一百度发现CLion可以和CubeMX联动。但我又一想,CLion打开CubeMX,有没有用我的命令行脚本强制调用jdk8,岂不是又要用jdk14?能不能打开exe就调用jdk8?

分析exe

直觉让我用360压缩打开这个exe,果然里面是个jar文件。。。
于是果断用jd-gui反编译看代码。花了大概2个小时理清了这样两件事:

  1. 根据报错日志找到代码,不知道为什么,在jdk14下有一行代码会抛出InvocationTargetException,导致MDK项目文件生成失败。
  2. jar包里有两个main函数。第一个main检查java版本,没装java会提示你装,装了的话会调用String javaVersion = System.getproperty("java.version");然后生成类似我之前那个批处理文件的指令调用第二个main,这个main才是产生gui界面的程序。

但是问题来了,第一个main函数又是谁调用的呢?

使用ida

之前ctf接触了ida,果断ida反编译,F5一按,原来如此。
我ida用的并不熟练,但一连串strcpy告诉我,这还是类似我那个cmd命令啊。。。大概是这样:
获取%JAVA_HOME%找到java的安装路径->安照java的命名格式分析java版本->选一个最高的生成cmd命令运行第一个main函数

终极解决方案

原来jdk14的安装文件夹为jdk-14.0.2,改成jdk-14,jdk14,哪怕是jdk1.8.0_999都行,因为命名不合法,他自动寻找到了我装的jdk8。问题就此解决

后记

问题解决后,现在看着之前百度时,论坛上那些工程师又是卸载高版本java或者用回老版本CubeMx。。。。。HHH
困扰我一学期的问题解决了的感觉真爽。。

ps:之前提到的用命令行打开cubeMX的方案,实际上是人工代替做了exe寻找java_home,形成命令调用第一个main函数的过程。

STM32CubeMx在JDK14环境中的使用

https://www.shjdgwj.cn/46f8c1baaf2a/

作者

GWJ

发布于

2021-01-16

更新于

2022-12-17

许可协议

评论