使用JOGL在Raspberry Pi上运行LibGDX-运行时出错

使用JOGL在Raspberry Pi上运行LibGDX-运行时出错,libgdx,raspberry-pi,jogl,raspberry-pi2,Libgdx,Raspberry Pi,Jogl,Raspberry Pi2,我正在尝试使用JOGL后端()在Raspberry Pi 2上运行一个LibGDX桌面应用程序(一个简单的应用程序,只显示一个图像,没有其他内容) 在当前的libgdx版本中,JoglApplicationConfiguration是抽象的,有两个子类:JoglAwtApplicationConfiguration和JoglNewtApplicationConfiguration 当我试图使用JoglAwtApplicationConfiguration运行它时,我得到一个错误: [java]

我正在尝试使用JOGL后端()在Raspberry Pi 2上运行一个LibGDX桌面应用程序(一个简单的应用程序,只显示一个图像,没有其他内容)

在当前的libgdx版本中,JoglApplicationConfiguration是抽象的,有两个子类:JoglAwtApplicationConfiguration和JoglNewtApplicationConfiguration

当我试图使用JoglAwtApplicationConfiguration运行它时,我得到一个错误:

 [java] glGetError 0x500
 [java] glGetError 0x500
 [java] JoglApplication: Couldn't initialize audio, disabling audio
 [java] java.lang.ExceptionInInitializerError
 [java]     at com.badlogic.gdx.backends.jogamp.JoglApplicationBase.<init>(JoglApplicationBase.java:54)
 [java]     at com.badlogic.gdx.backends.jogamp.JoglNewtApplication.<init>(JoglNewtApplication.java:49)
 [java]     at com.mygdx.game.desktop.DesktopLauncher.main(DesktopLauncher.java:14)
 [java] Caused by: com.jogamp.openal.ALException: Error opening default OpenAL device
 [java]     at com.jogamp.openal.util.ALut.alutInit(ALut.java:69)
 [java]     at com.badlogic.gdx.backends.jogamp.audio.OpenALAudio.<clinit>(OpenALAudio.java:41)
 [java]     ... 3 more
 [java] AL lib: (EE) ALCplaybackOSS_open: Could not open /dev/dsp: Nie ma takiego pliku ani katalogu
 [java] glGetError 0x500
 [java] Exception in thread "main-Animator#00" com.jogamp.opengl.util.AnimatorBase$UncaughtAnimatorException: com.jogamp.opengl.GLException: Caught NoSuchFieldError: gl on thread main-Animator#00
 [java]     at com.jogamp.opengl.util.DefaultAnimatorImpl.display(DefaultAnimatorImpl.java:61)
 [java]     at com.jogamp.opengl.util.AnimatorBase.display(AnimatorBase.java:451)
 [java]     at com.jogamp.opengl.util.Animator$MainLoop.run(Animator.java:198)
 [java]     at java.lang.Thread.run(Thread.java:724)
 [java] Caused by: com.jogamp.opengl.GLException: Caught NoSuchFieldError: gl on thread main-Animator#00
 [java]     at com.jogamp.opengl.GLException.newGLException(GLException.java:76)
 [java]     at jogamp.opengl.GLDrawableHelper.invokeGLImpl(GLDrawableHelper.java:1311)
 [java]     at jogamp.opengl.GLDrawableHelper.invokeGL(GLDrawableHelper.java:1131)
 [java]     at com.jogamp.newt.opengl.GLWindow.display(GLWindow.java:680)
 [java]     at com.jogamp.opengl.util.DefaultAnimatorImpl.display(DefaultAnimatorImpl.java:54)
 [java]     ... 3 more
 [java] Caused by: java.lang.NoSuchFieldError: gl
 [java]     at com.mygdx.game.MyGdxGame.render(MyGdxGame.java:21)
 [java]     at com.badlogic.gdx.backends.jogamp.JoglGraphicsBase.display(JoglGraphicsBase.java:164)
 [java]     at jogamp.opengl.GLDrawableHelper.displayImpl(GLDrawableHelper.java:691)
 [java]     at jogamp.opengl.GLDrawableHelper.display(GLDrawableHelper.java:673)
 [java]     at jogamp.opengl.GLAutoDrawableBase$2.run(GLAutoDrawableBase.java:442)
 [java]     at jogamp.opengl.GLDrawableHelper.invokeGLImpl(GLDrawableHelper.java:1277)
 [java]     ... 6 more
 [java] EGLDisplayUtil.EGLDisplays: Shutdown (open: 1)
 [java] EGLDisplayUtil: Open EGL Display Connections: 1
 [java] EGLDisplayUtil: Open[0]: 0x1: EGLDisplayRef[0x1: refCnt 2]
和启动器类:

package com.mygdx.game.desktop;

import com.badlogic.gdx.backends.jogamp.*;
import com.mygdx.game.MyGdxGame;

public class DesktopLauncher {
    public static void main (String[] arg) {
        JoglNewtApplicationConfiguration config = new JoglNewtApplicationConfiguration();
        new JoglNewtApplication(new MyGdxGame(), config);
        // OR:
        //JoglAwtApplicationConfiguration config = new JoglAwtApplicationConfiguration();
        //new JoglAwtApplication(new MyGdxGame(), config);
    }
}

如果OpenAL无法初始化 “AL lib:(EE)ALCplaybackOSS_open:无法打开/dev/dsp:没有这样的文件或目录” 这源于libopenal声音库, 找不到您的raspberry pi声卡 那么你有三个选择:

A) 加载Pi声卡的OSS linux内核驱动程序

sudo modprobe snd_pcm_oss
B) 禁用OpenAL软oss驱动程序: 编辑/etc/openal/alsoft.conf 并确保驱动程序列表包含-oss(它会禁用尝试使用不存在的dsp文件的oss后端)


C) 最好的解决方案是,如果OpenAL软件项目能够检测到OSS后端不工作,并使用其ALSA后端重试,但是这样的解决方案需要有人协作并向OpenAL软件上游打补丁,以使OpenAL软件在Raspberry Pi上开箱即用:

谢谢,modprobe帮助解决了音频错误,但下一个错误(来自JOGL)仍然存在,并且应用程序仍然无法启动。您在LibGDX中使用哪一版本的JOGL 2?不要把AWT和蝾螈混在一起。我将尝试重现您的问题。我不会将任何GL实例存储到字段中,您的一个错误来自com.mygdx.game.MyGdxGame.render。@user3626048 ClassCastException似乎来自AWT和X11之间的一个问题,可能无法解决它。但是,NoSuchFieldError是由设置中的问题引起的。我刚刚更新了我的存储库,它工作正常。它仍然使用JOGL 2.3.2-rc-20150812。我已经测试过在2015年使用JOGL 2.3.2在raspberry pi 2上运行libgdx,你也可以尝试这个构建,使用java-jar libgdx-demo-pax-britannica-1.6.3-armhf.jar启动它。请将你的源代码发布到某个地方(com.mygdx.game.mygdx.game.MyGdxGame??)或者用LibGDX提供的一个简单示例重现这些问题。我用代码编辑了我的文章。在您的环境中有一些问题,因为我的源代码中没有缺少Gdx中的“gl”字段:我从未使用过LibGDX生成器,我无法确认它是否能与JogAmp后端正常工作。您可以运行com.badlogic.gdx.tests.jogl.JoglTestStarter来运行测试,据我所知,它可以工作。
package com.mygdx.game.desktop;

import com.badlogic.gdx.backends.jogamp.*;
import com.mygdx.game.MyGdxGame;

public class DesktopLauncher {
    public static void main (String[] arg) {
        JoglNewtApplicationConfiguration config = new JoglNewtApplicationConfiguration();
        new JoglNewtApplication(new MyGdxGame(), config);
        // OR:
        //JoglAwtApplicationConfiguration config = new JoglAwtApplicationConfiguration();
        //new JoglAwtApplication(new MyGdxGame(), config);
    }
}
sudo modprobe snd_pcm_oss