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 的中文渲染链路:
-
应用请求渲染中文
-
系统找到默认字体 Tahoma(只有拉丁字母,无中文字形)
-
需要 glyph fallback(字形回退)去找中文字体
-
Wine 10.0 的 FontLink 回退机制不工作
-
结果:方框
尝试过以下方案,都失败了:
方案一:复制 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 的思路是直接替换系统字体,而非修复字形回退:
-
下载 Source Han Sans(思源黑体)
-
注册到
C:\Windows\Fonts\和注册表 -
通过
HKCU\Software\Wine\Fonts\Replacements将所有 Windows CJK 字体名映射到思源黑体
为什么有效:
-
思源黑体包含完整中日韩字形
-
所有 Windows 字体名(SimSun、Microsoft YaHei、MS Gothic 等)都被替换为思源黑体
-
任何字体请求都会返回一个有 CJK 支持的字体
-
winetricks 使用 UTF-16LE 编码的 .reg 文件导入注册表
-
配置写入 Wine prefix,永久生效
运行后 HiTool 和记事本的中文均正常显示。
四、关键发现
-
崩溃与 JRE 版本无关 :8u212 和 8u472 表现一致,都是 Wine 的
GetAdaptersAddresses实现问题 -
Wine 10 的 FontLink 字形回退机制不完整,不要依赖它
-
Wine 中文字体的正确解法是
winetricks cjkfonts------用思源黑体替换所有 CJK 字体名 -
HKCU\Software\Wine\Fonts\Replacements的 .reg 文件必须用 UTF-16LE 编码,否则中文键名无法导入 -
-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