UnsatisfiedLinkError Libgdx Desktop

9
我在桌面上使用LibGDX时遇到了问题。每当我尝试启动应用程序时,都会收到以下错误提示:
Exception in thread "main" java.lang.UnsatisfiedLinkError: com.badlogic.gdx.utils.BufferUtils.newDisposableByteBuffer(I)Ljava/nio/ByteBuffer;
at com.badlogic.gdx.utils.BufferUtils.newDisposableByteBuffer(Native Method)
at com.badlogic.gdx.utils.BufferUtils.newUnsafeByteBuffer(BufferUtils.java:288)
at com.badlogic.gdx.graphics.glutils.VertexArray.<init>(VertexArray.java:62)
at com.badlogic.gdx.graphics.glutils.VertexArray.<init>(VertexArray.java:53)
at com.badlogic.gdx.graphics.Mesh.<init>(Mesh.java:148)
at com.badlogic.gdx.graphics.g2d.SpriteBatch.<init>(SpriteBatch.java:173)
at com.badlogic.gdx.graphics.g2d.SpriteBatch.<init>(SpriteBatch.java:142)
at com.badlogic.gdx.graphics.g2d.SpriteBatch.<init>(SpriteBatch.java:121)
at com.badlogic.gdx.graphics.g2d.SpriteBatch.<init>(SpriteBatch.java:115)

我已经添加了以下库到我的项目中:
  • gdx.jar
  • gdx-sources.jar
  • gdx-natives.jar
  • gdx-backend-lwjgl.jar
  • gdx-backend-lwjgl-natives.jar
我是否遗漏了什么?
我已经搜索了很多,但是所有找到的都针对Android平台,让我添加来自arm文件夹的.so库到我的项目中,但这对于在Windows桌面平台上运行的项目来说并不合理。

1
它不必在类路径中,而是必须在库路径中,这意味着您必须通过将其值设置为包含so文件的目录路径来定义java.library.path系统属性。可以通过命令行或编程方式实现,但必须在代码尝试执行之前,否则将抛出UnsatisfiedLinkError异常。根据libgdx是什么,我建议您尝试@noone答案中的解决方案。 - linski
2个回答

24

我建议您使用这个GUI来设置您的项目。它应该为所有平台提供有效的设置。您也可以使用最新的夜间构建并检查问题是否仍然存在。问题可能是本机库与其他JAR文件不匹配。

另一个问题可能是您过早地实例化了SpriteBatch(或其他内部使用SpriteBatch的对象)(在堆栈跟踪中看起来有点像这样)。例如,静态地像这样:

private static SpriteBatch batch = new SpriteBatch();

由于此时libgdx没有设置正确,因此这不起作用。相反,在游戏的create/show方法中创建此类内容。


11
我相信答案是第二个(在LibGDX初始化之前调用了SpriteBatch构造函数)。 - P.T.
1
后者是正确的。谢谢! - jonbonazza
我犯了一个错误,是在我的游戏对象的构造函数中设置了一个屏幕,而不是在创建方法中设置。第二个答案对此很有道理。 - Moz
我遇到了同样的问题,但我确实使用了GUI程序来创建我的项目,并且我的“new SpriteBatch”函数调用并不是太早了。我详细地描述了我的问题,包括我尝试修复它所做的事情,在这里发布了:https://dev59.com/RLHma4cB1Zd3GeqPLnKS - user904542

0
使用以下的主方法体来启动对象:
static public void main(String[] args) throws Exception {
//      SkeletonViewer.args = args; 

    String os = System.getProperty("os.name"); 
    float dpiScale = 1;

    if (os.contains("Windows")) {
        dpiScale = Toolkit.getDefaultToolkit().
                getScreenResolution() / 96f;
    }

    if (os.contains("OS X")) {
        Object object = Toolkit.getDefaultToolkit().getDesktopProperty(
                "apple.awt.contentScaleFactor");
        if (object instanceof Float && ((Float) object).intValue() >= 2) {
            dpiScale = 2;
        }
    }

    if (dpiScale >= 2.0f) {
        uiScale = 2;
    }

    LwjglApplicationConfiguration.disableAudio = true;

    LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
    config.width = (int) (800 * uiScale);
    config.height = (int) (600 * uiScale);
    config.title = "Skeleton Viewer";
    config.allowSoftwareMode = true;
    config.samples = 2;

    new LwjglApplication(new SampleApplication(), config); 
} 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接