简体   繁体   中英

Android Studio | Libgdx | Adding Kryonet Library - NoClassDefFoundError

I am currently working on an Android game and want to implement multiplayer. So i wanted to use Kryonet:

  • I downloaded the library ( https://github.com/EsotericSoftware/kryonet/releases )
  • created a libs folder in my core module
  • copied the kryonet-2.21-all.jar into it
  • and added it as Module in the build.gradle:

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

In Android Studio it seemed to work, i had access to all imports etc., but when running the app on my device.. it crashed

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

I tried /gradlew clean in cmd and other stuff, but nothing helped. Please give me a hint im stuck since a few hours with this.. Thank you!

Make sure that you add:

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

in

project(":android")

in your build.gradle file too, not just the desktop project

I found a solution. I had a wrong approach. How to add Kryonet to a libgdx - Android project:

  • Go to root build.gradle
  • Go to project(":core") - dependencies and add:

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

  • Sync Project with Gradle Files

The important point is to add Kryonet, exclude Kryo and adding Kryo separately. Like that you can avoid this exception:

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

I hope i can help someone with this!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM