安卓工作室 | Libgdx |添加 Kryonet 库 - NoClassDefFoundError

Posted

技术标签:

【中文标题】安卓工作室 | Libgdx |添加 Kryonet 库 - NoClassDefFoundError【英文标题】:Android Studio | Libgdx | Adding Kryonet Library - NoClassDefFoundError 【发布时间】:2015-10-05 05:06:01 【问题描述】:

我目前正在开发一款 android 游戏,并希望实现多人游戏。 所以我想使用 Kryonet:

我下载了库 (https://github.com/EsotericSoftware/kryonet/releases) 在我的核心模块中创建了一个 libs 文件夹 将 kryonet-2.21-all.jar 复制到其中

并将其作为模块添加到 build.gradle 中:

dependencies 
 compile files('src/libs/kryonet-2.21-all.jar')  

在 Android Studio 中它似乎可以工作,我可以访问所有导入等,但是在我的设备上运行该应用程序时......它崩溃了

07-16 00:00:44.419  12176-12196/com.cookedapps.robotredemption.android E/AndroidRuntime﹕ FATAL EXCEPTION: GLThread 3363
Process: com.cookedapps.robotredemption.android, PID: 12176
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/esotericsoftware/kryonet/Server;
        at com.cookedapps.robotredemption.server.GameServer.<init>(GameServer.java:20)
        at com.cookedapps.robotredemption.states.Play.<init>(Play.java:73)
        at com.cookedapps.robotredemption.handlers.GameStateManager.getState(GameStateManager.java:39)
        at com.cookedapps.robotredemption.handlers.GameStateManager.pushState(GameStateManager.java:49)
        at com.cookedapps.robotredemption.handlers.GameStateManager.<init>(GameStateManager.java:21)
        at com.cookedapps.robotredemption.main.Game.create(Game.java:41)
        at com.badlogic.gdx.backends.android.AndroidGraphics.onSurfaceChanged(AndroidGraphics.java:241)
        at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1520)
        at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1248)
 Caused by: java.lang.ClassNotFoundException: Didn't find class "com.esotericsoftware.kryonet.Server" on path: DexPathList[[zip file "/data/app/com.cookedapps.robotredemption.android-2/base.apk"],nativeLibraryDirectories=[/data/app/com.cookedapps.robotredemption.android-2/lib/arm, /vendor/lib, /system/lib]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
        at com.cookedapps.robotredemption.server.GameServer.<init>(GameServer.java:20)
        at com.cookedapps.robotredemption.states.Play.<init>(Play.java:73)
        at com.cookedapps.robotredemption.handlers.GameStateManager.getState(GameStateManager.java:39)
        at com.cookedapps.robotredemption.handlers.GameStateManager.pushState(GameStateManager.java:49)
        at com.cookedapps.robotredemption.handlers.GameStateManager.<init>(GameStateManager.java:21)
        at com.cookedapps.robotredemption.main.Game.create(Game.java:41)
        at com.badlogic.gdx.backends.android.AndroidGraphics.onSurfaceChanged(AndroidGraphics.java:241)
        at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1520)
        at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1248)
Suppressed: java.lang.ClassNotFoundException: com.esotericsoftware.kryonet.Server
        at java.lang.Class.classForName(Native Method)
        at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
        at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
        ... 10 more
 Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available

我在 cmd 和其他东西中尝试了 /gradlew clean,但没有任何帮助。 请给我一个提示,我已经被这个卡住了几个小时了。谢谢!

【问题讨论】:

我也遇到了同样的问题,解决方法是复制 jar 到 android/libs 或者 root build.gradle -> android 项目里面 ->inside dependencies-> compile fileTree(dir:'../core/libs', include:'*.jars') 【参考方案1】:

我找到了解决方案。我的方法有误。 如何将 Kryonet 添加到 libgdx - Android 项目:

转到根 build.gradle 转到project(":core") - dependencies 并添加:

compile "com.esotericsoftware:kryo:3.0.1" compile ("com.esotericsoftware:kryonet:2.22.0-RC1") exclude module : 'kryo'

使用 Gradle 文件同步项目

重点是添加Kryonet,排除Kryo,分别添加Kryo。这样可以避免这个异常:

UNEXPECTED TOP-LEVEL EXCEPTION: com.android.dex.DexException: Multiple dex files define

我希望我能帮助别人!

【讨论】:

DexException 与 Kryonet 无关,它仅表示您已达到在不打开 multidex 的情况下可以使用的最大方法数。因此,您可以通过排除任何任意包以使总大小/方法数量更小来实现这一目标 如何设置编译为最新版本?【参考方案2】:

确保添加:

dependencies 
 compile files('src/libs/kryonet-2.21-all.jar') 

project(":android")

也在您的 build.gradle 文件中,而不仅仅是桌面项目

【讨论】:

以上是关于安卓工作室 | Libgdx |添加 Kryonet 库 - NoClassDefFoundError的主要内容,如果未能解决你的问题,请参考以下文章

LibGDX:安卓游戏安全

无法在Libgdx中显示文本

17.使用android_studio开发libgdx

LibGDX:AudioFlinger 无法创建轨道,状态 -12

Libgdx Liquidfan android错误

Libgdx/Java ShadowMap 和 Framebuffer 使用相机更新