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 的 GetAdaptersAddressesAF_UNSPEC(同时查询 IPv4+IPv6)模式下返回 ERROR_INVALID_DATAAF_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
相关推荐
coder_lorraine1 小时前
手把手教你用 Docker Compose 部署 Twikoo 评论系统
mongodb·docker·容器
bksczm1 小时前
Linux之网络层协议(IP协议)
linux·网络·tcp/ip
玖釉-1 小时前
nvpro_core2 源码与架构解析:NVIDIA Vulkan 图形开发基础框架
c++·windows·图形渲染
微擎应用市场1 小时前
微擎面板 W7Panel:一站式云原生管理平台,让 Kubernetes 触手可及
云原生·容器·kubernetes
深念Y1 小时前
无头电视盒子改服务器调优记录
linux·运维·服务器·串口·嵌入式·电视盒子·海思
张洛闻Eren1 小时前
云原生k8s【第一课】: Docker 容器技术
运维·云原生·容器·k8s
量化分析1 小时前
迁移docker部署的wordpress
运维·docker·容器
我是小灰灰吖2 小时前
Qt 6.9.3 Ubuntu 22.04 虚拟键盘显示问题全记录与解决方案
linux·qt·ubuntu
Mortalbreeze2 小时前
深入理解TCP协议(一):TCP报文格式详解
linux·服务器·网络·tcp/ip