Wine 运行 HiTool 踩坑记录

2026/7/20

背景

HiTool 是华为海思提供的 SoC 烧录调试工具,仅支持 Windows。需要在 Debian 13 上通过 Wine 运行,用于烧录 HI3798MV100 机顶盒。

环境:Debian 13 (Trixie) / Wine 10.0 / HiTool(华为海思烧录工具)

本文记录从安装到解决两个核心问题(Java 崩溃 + 中文字体方框)的完整过程。


一、安装与初次启动

bash

复制代码
sudo apt install wine

HiTool 是绿色版,直接解压到 /home/a1/HiTool/ 即可。

目录结构:

text

复制代码
HiTool/
├── HiTool.exe          # 主程序(Eclipse RCP 应用)
├── HiTool.ini          # JVM 启动配置
├── jre/                # 内置 JRE 8u212(32-bit)
├── jre.adoptium/       # 备用 JRE 8u472
├── plugins/            # Eclipse 插件
└── ExternalTools/      # 外部工具(可选)

启动:

bash

复制代码
cd /home/a1/HiTool
wine ./HiTool.exe

遇到两个问题。


二、问题一:Java 崩溃

现象

启动后立刻崩溃:

text

复制代码
java.lang.Error
    at java.net.NetworkInterface.getAll(Native Method)

Java 调用 GetAdaptersAddresses(AF_UNSPEC, ...) 时收到错误码 13(ERROR_INVALID_DATA),Java 8 将其视为致命错误直接抛出 Error。

排查过程

怀疑是 HiTool 内置 JRE 8u212 版本太旧。备份后替换为 Adoptium JRE 8u472,结果完全一致,说明与 JRE 版本无关。

为了确认问题在 Wine 层,写了一个 C 程序在 Wine 中测试 GetAdaptersAddresses 的行为:

c

复制代码
ret = fn(AF_UNSPEC, flags, NULL, buf, &bufSize);  // → 13 (ERROR_INVALID_DATA)
ret = fn(AF_INET, flags, NULL, buf, &bufSize);    // → 0 (SUCCESS)

结论:Wine 10.0 的 GetAdaptersAddresses 在 AF_UNSPEC(同时查询 IPv4+IPv6)模式下返回 ERROR_INVALID_DATA,AF_INET(仅 IPv4)正常。

解决方案

在 HiTool.ini 的 -vmargs 末尾添加:

ini

复制代码
-Djava.net.preferIPv4Stack=true

这个参数强制 Java 走 IPv4-only 代码路径(NetworkInterface.c,调用 GetIpAddrTable),绕过 GetAdaptersAddresses。

修改后 HiTool 正常启动,只剩一个无关的 FileNotFoundException: ExternalTools\tools.xml(缺少可选外部工具配置,不影响功能)。


三、问题二:中文字体显示为方框

现象

HiTool 界面中的中文全部显示为方框,记事本等 Wine 自带程序同样如此。

排查过程

Wine 的中文渲染链路:

  1. 应用请求渲染中文

  2. 系统找到默认字体 Tahoma(只有拉丁字母,无中文字形)

  3. 需要 glyph fallback(字形回退)去找中文字体

  4. Wine 10.0 的 FontLink 回退机制不工作

  5. 结果:方框

尝试过以下方案,都失败了:

方案一:复制 Noto CJK 字体

bash

复制代码
cp NotoSansCJK-Regular.ttc ~/.wine/drive_c/windows/Fonts/MSYH.TTC

Wine 将字体注册为内部名 "Noto Sans CJK SC",而非 "Microsoft YaHei",应用不认。

方案二:Windows FontSubstitutes 注册表

设置 SimSun → Noto Serif CJK SC。Wine 不读这个键做字形回退。

方案三:Wine Replacements 键

HKCU\Software\Wine\Fonts\Replacements。可能是编码问题(需 UTF-16LE),且回退机制本身不工作。

方案四:FontLink 控制值

设置 FontLinkControl=0x4000。Wine 10 的 FontLink 实现有缺陷。

最终解决方案

bash

复制代码
sudo apt install cabextract
wget https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks
chmod +x winetricks
./winetricks -q cjkfonts

winetricks cjkfonts 的思路是直接替换系统字体,而非修复字形回退:

  1. 下载 Source Han Sans(思源黑体)

  2. 注册到 C:\Windows\Fonts\ 和注册表

  3. 通过 HKCU\Software\Wine\Fonts\Replacements 将所有 Windows CJK 字体名映射到思源黑体

为什么有效:

  • 思源黑体包含完整中日韩字形

  • 所有 Windows 字体名(SimSun、Microsoft YaHei、MS Gothic 等)都被替换为思源黑体

  • 任何字体请求都会返回一个有 CJK 支持的字体

  • winetricks 使用 UTF-16LE 编码的 .reg 文件导入注册表

  • 配置写入 Wine prefix,永久生效

运行后 HiTool 和记事本的中文均正常显示。


四、关键发现

  1. 崩溃与 JRE 版本无关 :8u212 和 8u472 表现一致,都是 Wine 的 GetAdaptersAddresses 实现问题

  2. Wine 10 的 FontLink 字形回退机制不完整,不要依赖它

  3. Wine 中文字体的正确解法是 winetricks cjkfonts------用思源黑体替换所有 CJK 字体名

  4. HKCU\Software\Wine\Fonts\Replacements 的 .reg 文件必须用 UTF-16LE 编码,否则中文键名无法导入

  5. -Djava.net.preferIPv4Stack=true 是必须的,与字体无关


五、最终 HiTool.ini

ini

复制代码
-startup
plugins/org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.200.v20140116-2212
-vm
jre\bin\javaw.exe
-vmargs
-Xverify:none
-Xms40m
-Xmx128m
-Xnoclassgc
-XX:CMSInitiatingOccupancyFraction=85
-XX:DefaultMaxRAMFraction=1
-XX:+UseParallelGC
-XX:NewRatio=8
-XX:SurvivorRatio=8
-XX:TargetSurvivorRatio=90
-XX:MaxTenuringThreshold=15
-XX:+UseBiasedLocking
-XX:CompileCommand=quiet
-XX:CompileCommand=exclude,org/eclipse/core/internal/dtree/DataTreeNode,forwardDeltaWith
-XX:CompileCommand=exclude,java/text/SimpleDateFormat,subParseZoneString
-XX:CompileCommand=exclude,org/eclipse/jdt/internal/compiler/lookup/ParameterizedMethodBinding,<init>
-Djava.net.preferIPv4Stack=true

六、快速复现

bash

复制代码
# 1. 安装依赖
sudo apt install wine cabextract

# 2. 初始化 Wine prefix
wineboot

# 3. 安装 CJK 字体(一次性,约 100MB 下载)
wget https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks
chmod +x winetricks
./winetricks -q cjkfonts

# 4. 解压 HiTool 到 ~/HiTool/

# 5. 修改 HiTool.ini,在 -vmargs 末尾添加:
#    -Djava.net.preferIPv4Stack=true

# 6. 启动
cd ~/HiTool && wine ./HiTool.exe
相关推荐
向成科技8 小时前
XC3576H工控主板|深度适配Ubuntu 26.04 LTS,释放边缘AI与工业开发新潜能
linux·人工智能·ubuntu·机器人·硬件·主板·边缘ai
Fcy6488 小时前
Linux下 进程间关系与守护进程
linux·运维·服务器·守护进程
码农小韩9 小时前
Linux驱动理论(二)——Linux字符设备驱动
linux·嵌入式软件开发·linux操作系统·linux应用开发·linux驱动理论
well06129 小时前
Linux粘滞位与Makefile机制深度解析
linux·运维·服务器
再写一行代码就下班9 小时前
linux sh脚本在windows修改导致无法使用解决方式
java·linux·centos
额额额对了9 小时前
SPI通信
linux·c语言·汇编·单片机·嵌入式硬件·arm
子木HAPPY阳VIP10 小时前
Ubuntu 关闭防火墙操作步骤
linux·运维·ubuntu
王振超wzc10 小时前
嵌入式开发环境搭建--WM软件安装,Ubuntu操作系统安装
linux·运维·ubuntu
2601_9623649711 小时前
从录入到解锁,完整梳理 Windows Hello 识别链路
windows·安全·电脑
AutumnWind042011 小时前
【Docker Compose 快速入门】
运维·docker·容器