STM32CubeMx在JDK14环境中的使用
前景
最近在学习Stm32,装了STM32CubeMX,但在我生成MDk项目时出现了
百度发现这是两个两种原因造成:
- 项目含有中文路径
- 没有使用jdk8
- 用老版本CubeMX(挺老的版本)
我是后者,但是平常写IDEA写Java项目时,又用到了JDK14。一开始我是百度
Java 多版本共存
查到了如图解决方案但是在使用 %JAVA_HOME8% 环境变量时,依旧出现问题,用资源管理器查看javaw.exe发现他依旧调用的是jdk14环境下的javaw.exe。
迫不得已,我只能在使用STM32CubeMX时卸载JAVA解决问题,但每次重新安装JDK14都嫌累orz
灵感来源
以前玩WOT时特别想要其登录界面的背景视频,于是接触了process explorer这款软件,昨天我突发奇想,用这款软件能不能查看为什么在JDK8的环境下cubemx依旧用jdk14运行。果然,我发现了这个玩意,那就简单了,我当即写了个cmd脚本
1 |
|
问题解决
根治问题
解决了问题非常兴奋,但是,今早用keil时对这个编辑器越用越烦(破代码提示),JetBrains全家桶不香吗,一百度发现CLion可以和CubeMX联动。但我又一想,CLion打开CubeMX,有没有用我的命令行脚本强制调用jdk8,岂不是又要用jdk14?能不能打开exe就调用jdk8?
分析exe
直觉让我用360压缩打开这个exe,果然里面是个jar文件。。。
于是果断用jd-gui反编译看代码。花了大概2个小时理清了这样两件事:
- 根据报错日志找到代码,不知道为什么,在jdk14下有一行代码会抛出InvocationTargetException,导致MDK项目文件生成失败。
- 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环境中的使用