永中Office Linux 版无法启动:Error:cls==NULL 排查与修复
环境
- 系统:ARM64 (aarch64) Linux
- 永中Office版本:
com.yozosoft.yozo-office 9.0.3988.191ZH.S1 - 安装路径:
/opt/apps/com.yozosoft.yozo-office/files/
现象
安装永中Office后,无论从桌面快捷方式还是终端运行,应用均无任何界面弹出,进程瞬间退出,无任何终端报错。
排查过程
1. 找到安装目录
$ dpkg -l | grep -i yozo
ii com.yozosoft.yozo-office 9.0.3988.191ZH.S1 arm64 Yozo Office
$ find /opt -name "*yozo*" -type d
/opt/apps/com.yozosoft.yozo-office2. 查看启动日志
永中Office在安装目录下有一个 startlog.txt,记录了每次启动的简要信息:
$ cat /opt/apps/com.yozosoft.yozo-office/files/startlog.txtYozo_Office.bin: Version1.10; JRE: Version1.6.0_01
Line 693 : Error:cls==NULL每次都只有这一行错误。cls==NULL 意味着 JNI 层试图查找某个 Java 类时得到了空指针——JVM 根本没有正常初始化。
3. 检查 JRE
永中Office 自带了捆绑的 JRE:
$ /opt/apps/com.yozosoft.yozo-office/files/Jre/bin/java -version
openjdk version "1.8.0-internal"
OpenJDK Runtime Environment (Loongson 8.1.10-aarch64-Kylin)
OpenJDK 64-Bit Server VM (build 25.71-b00, mixed mode)Java 能正常输出版本信息,说明 JRE 本身没有损坏。问题出在 JVM 初始化过程中加载的某个 native 库。
4. 检查自带 native 库
$ find /opt/apps/com.yozosoft.yozo-office/files/Jre -name "libfreetype*"
/opt/apps/com.yozosoft.yozo-office/files/Jre/lib/aarch64/libfreetype.so.6JRE 的 lib/aarch64/ 目录下捆绑了老版本的 libfreetype.so.6。考虑到 Error:cls==NULL 是 JVM 初始化阶段报的错,而 FreeType 是 JRE font subsystem 的关键依赖,这个老旧的 .so 很可能与系统当前的 FreeType 产生符号冲突,导致 JVM 加载失败。
这是永中Office在较新 Linux 系统上的已知通病。在 x86_64 架构上,同样的
libfreetype.so.6位于Jre/lib/amd64/下,症状可能是symbol lookup error: undefined symbol: FT_Get_Transform;而在 aarch64 架构上则表现为Error:cls==NULL,本质上都是同一类库版本冲突。
解决方法
把 JRE 自带的 libfreetype.so.6 重命名(或删除),让 JVM 使用系统自带的 FreeType:
sudo mv /opt/apps/com.yozosoft.yozo-office/files/Jre/lib/aarch64/libfreetype.so.6 \
/opt/apps/com.yozosoft.yozo-office/files/Jre/lib/aarch64/libfreetype.so.6.bak然后重新启动:
$ /opt/apps/com.yozosoft.yozo-office/files/bin/yozo &
$ pgrep -a Yozo
11845 /opt/apps/com.yozosoft.yozo-office/files/Yozo_Office.bin进程正常运行,桌面界面正常弹出,问题解决。
总结
| 架构 | JRE 自带库路径 | 典型报错 |
|---|---|---|
| x86_64 | Jre/lib/amd64/libfreetype.so.6 | symbol lookup error: FT_Get_Transform |
| aarch64 | Jre/lib/aarch64/libfreetype.so.6 | Error:cls==NULL |
解决方式都一样:移除或重命名 JRE 目录下自带的 libfreetype.so.6,让它 fallback 到系统库。