生于忧患,咸鱼安乐
Toggle navigation
Home
About Me
Archives
Tags
在Windows on arm上原生运行IntelliJ IDEA
2022-10-16 21:49:31
223
0
0
squarefong
## 零、背景 ~~没忍住,入手了Huawei Matebook E Go,一个在高通骁龙 8cx Gen3上装 Windows 的二合一产品~~ 到手折腾了一下这上面怎么搭建开发环境,Visual Studio和VS Code其实都有Arm64的原生版本了,但是还是想折腾一下IDEA。IDEA的官网并没有区分指令集,下载下来发现IDEA就是x64的。 ![title](/api/file/getImage?fileId=634be3652fc01e046b00167d) 非原生运行也不是不行,~~就是觉得不清真,~~但是响应速度很慢。 好在Jetbrain家的IDE都是拿Java写的,这就给了折腾空间。这篇记录一下折腾的过程。 ## 一、安装ARM64版本的JDK 首先是下载 arm64 的原生JDK,都上微软的系统了,那就顺手下载一个 [微软构建的OpenJDK](https://learn.microsoft.com/en-us/java/openjdk/download) 吧。我现在下载的是17,建议下载安装包而不是压缩包,安装包会自动设置环境变量`PATH`和`JAVA_HOME`。 ## 二、替换IDEA的JRE 然后是下载IDEA的压缩包,方便后面去替换文件。 微软JDK的安装路径是`C:\Program Files (Arm)\Microsoft\jdk-17.0.4.101-hotspot\`,`JAVA_HOME`也在这里。将IDEA的压缩解压后,就需要使用微软JDK里面的JRE替换Jetbrain自带的JRE,直接将`C:\Program Files (Arm)\Microsoft\jdk-17.0.4.101-hotspot`下的全部内容拷贝到`ideaIC-2022.2.3.win\jbr`下,然后运行`ideaIC-2022.2.3.win\bin\idea.bat`,这就算初步实现了Arm64原生运行IDEA。 ![title](/api/file/getImage?fileId=634be0802fc01e046b00167c) 此时写个 Hello world 其实已经能跑了,但是你会发现有时候构建/运行会出现报错,如果关掉IDEA重新打开,就又好了,重新新建项目,又有这个问题,似乎一次启动中第一次打开的项目就不会有问题。 ![title](/api/file/getImage?fileId=634be6002fc01e046b00167e) 报错内容:`Could not initialize class org.jvnet.winp.Native` ## 三、重新编译打包winp.jar ~~都走到这了,就再折腾一波~~ 搜了一下winp,发现是一个Java库,给win的一个用来管理进程的库。通过`jar -xvf ideaIC-2022.2.3.win\lib\winp.jar`发现,这里面有原生二进制文件,不全是java写的。可能是java代码调原生库的时候出现了指令集架构不匹配问题。 那么就尝试手动编译出`winp.jar`。 首先去下载winp这个项目的[源码](https://github.com/jenkinsci/winp) 编译这个项目,需要先 [安装mvn](https://www.runoob.com/maven/maven-setup.html) 和 Visual Studio,我现在安装的2022 Preview,因为只有这一版是arm64原生的。。。 安装好依赖后去winp项目的源码里面修改。 首先要修改`build.cmd`,把`PATH`和`VCTargetsPath`修改成自己的安装路径。在下面也要添加ARM64的编译项。 接着是C代码的工程文件,需要修改所有涉及的项目的工程文件。以winp项目为根目录需要修改以下文件:`native\winp.sln`、`native\winp.vcxproj`、`native\sendctrlc\sendctrlc.vcxproj`、`native_test\testapp\testapp.vcxproj`。修改的内容参考本文末尾。 修改完成后执行build.cmd,等待一段时间后会有报错。 先别慌,如果这个报错是最后封装测试阶段的了,jar没有出来,那么其实.exe和.dll已经有了,在`target\classes`下。先去把`idea\lib\winp.jar`拷贝出来,用`jar -xvf winp.jar`解压后,用编译出来的`winp.ARM64.dll`覆盖原本解压的`winp.x64`,用`sendctrlc.ARM64.exe`覆盖原本解压出的`sendctrlc.x64.exe`。**(对,是覆盖,只是单纯的把arm64版本的拷进去还是有问题)**最后执行`jar --create --file winp.jar --main-class=org.jvnet.winp.Main -C .\new\ .` 并用现在打包出来的`winp.jar`替换原来的`winp.jar`即可。这时就可以随便新建工程不出错了,目前我测了几次,没什么问题。 ## 附1:我在用的winp.jar [winp.jar](https://leanote.squarefong.com/api/file/getAttach?fileId=634c0b572fc01e046b001682) ## 附2:对于winp上编译arm64版本的修改 `git diff`了一下,所有输出打包到了这里[mypatch.patch](https://leanote.squarefong.com/api/file/getAttach?fileId=634c0abc2fc01e046b001680)
Pre:
Next:
在Windows下用VS Code写C++(msvc编译,使用环境变量)
0
likes
223
Weibo
Wechat
Tencent Weibo
QQ Zone
RenRen
Please enable JavaScript to view the
comments powered by Disqus.
comments powered by
Disqus
Table of content