V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
thetbw
V2EX  ›  问与答

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

  •  
  •   thetbw · 2022-07-03 22:51:08 +08:00 · 1263 次点击
    这是一个创建于 876 天前的主题,其中的信息可能已经有所发展或是发生改变。

    是这样,最近在折腾一个游戏掌机,使用的是 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 卡中吗

    8 条回复    2022-07-05 12:49:13 +08:00
    Bingchunmoli
        1
    Bingchunmoli  
       2022-07-03 23:02:58 +08:00 via Android
    多半是因为依赖的是 openjdk 不带字体,oracle 带字体,k8s 部署 easyexcel 遇到同类问题,要么换代码,要么用 oracle
    thetbw
        2
    thetbw  
    OP
       2022-07-03 23:11:12 +08:00
    @Bingchunmoli 可能我写的太多了你没有读完,我用的就是 oracle ,而且自带字体
    ldyisbest
        3
    ldyisbest  
       2022-07-03 23:14:40 +08:00
    字体打到 jar 里面,然后程序里面读。之前做过
    Bingchunmoli
        4
    Bingchunmoli  
       2022-07-04 01:03:33 +08:00
    @thetbw 那就不是很清楚了,之前遇到的没有字体就是要么换 oracle 要么是 docker 加一个 yum install 字体 或者就是代码不调用 easyexcel 库自己实现。qwq
    maowu
        5
    maowu  
       2022-07-04 07:34:44 +08:00 via Android
    能问下,你那个掌机哪里能买到吗?
    thetbw
        6
    thetbw  
    OP
       2022-07-04 09:07:59 +08:00
    @maowu https://lemiyoo.cn/product/143.html 大概 2 ,3 百块钱,感觉还行吧,就是玩游戏有点费眼,以前的老游戏总喜欢画面一闪一闪的,在以前的大屁股电视上感觉没啥,在现在的 lcd 或 oled 上,就感觉难受
    maowu
        7
    maowu  
       2022-07-05 12:45:14 +08:00 via Android
    @thetbw 看了下感觉还不错,之前关注过一款树莓派掌机,要 8 百多,不过配置高了一点
    thetbw
        8
    thetbw  
    OP
       2022-07-05 12:49:13 +08:00 via Android
    @maowu 树莓派的太坑了,本身树莓派溢价就太高了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5546 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 06:40 · PVG 14:40 · LAX 22:40 · JFK 01:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.