是这样,最近在折腾一个游戏掌机,使用的是 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 卡中吗
1
Bingchunmoli 2022-07-03 23:02:58 +08:00 via Android
多半是因为依赖的是 openjdk 不带字体,oracle 带字体,k8s 部署 easyexcel 遇到同类问题,要么换代码,要么用 oracle
|
2
thetbw OP @Bingchunmoli 可能我写的太多了你没有读完,我用的就是 oracle ,而且自带字体
|
3
ldyisbest 2022-07-03 23:14:40 +08:00
字体打到 jar 里面,然后程序里面读。之前做过
|
4
Bingchunmoli 2022-07-04 01:03:33 +08:00
@thetbw 那就不是很清楚了,之前遇到的没有字体就是要么换 oracle 要么是 docker 加一个 yum install 字体 或者就是代码不调用 easyexcel 库自己实现。qwq
|
5
maowu 2022-07-04 07:34:44 +08:00 via Android
能问下,你那个掌机哪里能买到吗?
|
6
thetbw OP @maowu https://lemiyoo.cn/product/143.html 大概 2 ,3 百块钱,感觉还行吧,就是玩游戏有点费眼,以前的老游戏总喜欢画面一闪一闪的,在以前的大屁股电视上感觉没啥,在现在的 lcd 或 oled 上,就感觉难受
|