求助一个在嵌入式 Linux 中运行 Java 加载不到字体的问题

2022-07-03 22:51:08 +08:00
 thetbw

是这样,最近在折腾一个游戏掌机,使用的是 arm 处理器和 linux 系统,也就是所谓的开源掌机

我的童年其实更多是 手机游戏,以前的java me和早期的android,所以就有了移植java me游戏到这个掌机上的想法。

在 github 上有个开源项目叫 freej2me ,可以提供 java me 需要的类,绘图方面,可以使用 jni 直接写入 framebuffer ,或者使用 sdl 。

oracle 的 jre8 arm 我试了下,可以在上面运行,最近断断续续折腾了一两个月,最近被卡住的一个问题就是,所有的步骤几乎都完成了,也可以使用 java 显示画面了。就是 java 的 BufferedImage 调用显示文字的时候,会有一个空指针异常。

错误大概如下

Fontconfig error: Cannot load default config file
Fontconfig error: Cannot load default config file
Exception in thread "Test" java.lang.Error: Probable fatal error:No fonts found.
	at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1246)
	at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1110)
	at sun.font.SunFontManager.initialiseDeferredFonts(SunFontManager.java:937)
	at sun.font.SunFontManager.loadFonts(SunFontManager.java:3327)
	at sun.awt.X11FontManager.loadFonts(X11FontManager.java:460)
	at sun.font.SunFontManager.findFont2D(SunFontManager.java:2358)
	at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1230)
	at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1110)
	at sun.font.SunFontManager.initialiseDeferredFonts(SunFontManager.java:937)
	at sun.font.SunFontManager.loadFonts(SunFontManager.java:3327)
	at sun.awt.X11FontManager.loadFonts(X11FontManager.java:460)
	at sun.font.SunFontManager.findFont2D(SunFontManager.java:2358)
	at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1230)
	at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1110)
	at sun.font.SunFontManager.initialiseDeferredFonts(SunFontManager.java:937)
	at sun.font.SunFontManager.loadFonts(SunFontManager.java:3327)
	at sun.awt.X11FontManager.loadFonts(X11FontManager.java:460)
	at sun.font.SunFontManager.findFont2D(SunFontManager.java:2358)
	at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1230)
	at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1110)
	at sun.font.SunFontManager.initialiseDeferredFonts(SunFontManager.java:937)
	at sun.font.SunFontManager.loadFonts(SunFontManager.java:3327)
	at sun.awt.X11FontManager.loadFonts(X11FontManager.java:460)
	at sun.font.SunFontManager.findFont2D(SunFontManager.java:2358)
	at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1230)
	at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1110)
	at sun.font.SunFontManager.initialiseDeferredFonts(SunFontManager.java:937)
	at sun.font.SunFontManager.loadFonts(SunFontManager.java:3327)
	at sun.awt.X11FontManager.loadFonts(X11FontManager.java:460)
	at sun.font.SunFontManager.findFont2D(SunFontManager.java:2358)
	at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1230)
	at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1110)
	at sun.font.SunFontManager.initialiseDeferredFonts(SunFontManager.java:937)
	at sun.font.SunFontManager.loadFonts(SunFontManager.java:3327)
	at sun.awt.X11FontManager.loadFonts(X11FontManager.java:460)
	at sun.font.SunFontManager.findFont2D(SunFontManager.java:2358)
	at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1230)
	at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1110)
	at sun.font.SunFontManager.initialiseDeferredFonts(SunFontManager.java:937)
	at sun.font.SunFontManager.loadFonts(SunFontManager.java:3327)
	at sun.awt.X11FontManager.loadFonts(X11FontManager.java:460)
	at sun.font.SunFontManager.findFont2D(SunFontManager.java:2358)
	at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1230)
	at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1110)
	at sun.font.CompositeFont.doDeferredInitialisation(CompositeFont.java:287)
	at sun.font.CompositeFont.getSlotFont(CompositeFont.java:376)
	at sun.font.CompositeGlyphMapper.initMapper(CompositeGlyphMapper.java:81)
	at sun.font.CompositeGlyphMapper.<init>(CompositeGlyphMapper.java:62)
	at sun.font.CompositeFont.getMapper(CompositeFont.java:433)
	at sun.font.GlyphList.mapChars(GlyphList.java:269)
	at sun.font.GlyphList.setFromString(GlyphList.java:244)
	at sun.java2d.pipe.GlyphListPipe.drawString(GlyphListPipe.java:71)
	at sun.java2d.SunGraphics2D.drawString(SunGraphics2D.java:2933)
	at org.tw.pi.framebuffer.TestFrameBuffer$1.run(TestFrameBuffer.java:111)

原因应该就是 jre 依赖于fontconfig,而这个 linux 上并没有 fontconfig,我添加了其他同型号机型编译的 fontconfig 的 so,和 fonts.conf配置文件,依然是报错找不到字体。

另外,jre 目录下 lib 中是有字体文件的,我也指定了字体配置的环境变量

还是需要自己编译一个 fontconfig ? 但是编译好之后又该怎么做呢,因为这个系统你是不方便往 /usr 这些目录写文件的,第三方程序都被挂载在 sd 卡目录 /mnt/SDCARD,我编译后方便安装在 sd 卡中吗

1044 次点击
所在节点    问与答
8 条回复
Bingchunmoli
2022-07-03 23:02:58 +08:00
多半是因为依赖的是 openjdk 不带字体,oracle 带字体,k8s 部署 easyexcel 遇到同类问题,要么换代码,要么用 oracle
thetbw
2022-07-03 23:11:12 +08:00
@Bingchunmoli 可能我写的太多了你没有读完,我用的就是 oracle ,而且自带字体
ldyisbest
2022-07-03 23:14:40 +08:00
字体打到 jar 里面,然后程序里面读。之前做过
Bingchunmoli
2022-07-04 01:03:33 +08:00
@thetbw 那就不是很清楚了,之前遇到的没有字体就是要么换 oracle 要么是 docker 加一个 yum install 字体 或者就是代码不调用 easyexcel 库自己实现。qwq
maowu
2022-07-04 07:34:44 +08:00
能问下,你那个掌机哪里能买到吗?
thetbw
2022-07-04 09:07:59 +08:00
@maowu https://lemiyoo.cn/product/143.html 大概 2 ,3 百块钱,感觉还行吧,就是玩游戏有点费眼,以前的老游戏总喜欢画面一闪一闪的,在以前的大屁股电视上感觉没啥,在现在的 lcd 或 oled 上,就感觉难受
maowu
2022-07-05 12:45:14 +08:00
@thetbw 看了下感觉还不错,之前关注过一款树莓派掌机,要 8 百多,不过配置高了一点
thetbw
2022-07-05 12:49:13 +08:00
@maowu 树莓派的太坑了,本身树莓派溢价就太高了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/863829

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX