Java LibGdx[致命异常]加载skin.json文件

Java LibGdx[致命异常]加载skin.json文件,java,android,json,intellij-idea,libgdx,Java,Android,Json,Intellij Idea,Libgdx,我在用Intellij。一切正常,APK部署在我的Android系统中,但它只是停留在黑屏上,回到家里说“‘游戏’停止了: 1023-1051/? E/AndroidRuntime﹕ FATAL EXCEPTION: GLThread 1591 Process: net.mygdx.game.android, PID: 1023 com.badlogic.gdx.utils.ax: Error reading file: jsonSkin.json at com.badl

我在用Intellij。一切正常,APK部署在我的Android系统中,但它只是停留在黑屏上,回到家里说“‘游戏’停止了:

    1023-1051/? E/AndroidRuntime﹕ FATAL EXCEPTION: GLThread 1591
Process: net.mygdx.game.android, PID: 1023
com.badlogic.gdx.utils.ax: Error reading file: jsonSkin.json
        at com.badlogic.gdx.e.a.a.i.a(Unknown Source)
        at com.badlogic.gdx.e.a.a.i.<init>(Unknown Source)
        at net.mygdx.game.a.a(Unknown Source)
        at com.badlogic.gdx.backends.android.i.onSurfaceChanged(Unknown Source)
        at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1520)
        at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1248)
 Caused by: com.badlogic.gdx.utils.ax: Error reading file: skins/jsonSkin.json
        at com.badlogic.gdx.utils.k.a(Unknown Source)
            at com.badlogic.gdx.e.a.a.i.a(Unknown Source)
            at com.badlogic.gdx.e.a.a.i.<init>(Unknown Source)
            at org.mygdx.gam.a.a(Unknown Source)
            at com.badlogic.gdx.backends.android.i.onSurfaceChanged(Unknown Source)
            at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1520)
            at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1248)
 Caused by: com.badlogic.gdx.utils.ax:
        at com.badlogic.gdx.e.a.a.k.a(Unknown Source)
        at com.badlogic.gdx.e.a.a.k.b(Unknown Source)
        at com.badlogic.gdx.utils.k.a(Unknown Source)
        at com.badlogic.gdx.e.a.a.j.a(Unknown Source)
            at com.badlogic.gdx.utils.k.a(Unknown Source)
            at com.badlogic.gdx.e.a.a.i.a(Unknown Source)
            at com.badlogic.gdx.e.a.a.i.<init>(Unknown Source)
            at net.mygdx.game.a.a(Unknown Source)
            at com.badlogic.gdx.backends.android.i.onSurfaceChanged(Unknown Source)
            at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1520)
            at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1248)
 Caused by: com.badlogic.gdx.utils.b.e: Class not found: com.badlogic.gdx.graphics.g2d.BitmapFont
        at com.badlogic.gdx.utils.b.b.a(Unknown Source)
            at com.badlogic.gdx.e.a.a.k.a(Unknown Source)
            at com.badlogic.gdx.e.a.a.k.b(Unknown Source)
            at com.badlogic.gdx.utils.k.a(Unknown Source)
            at com.badlogic.gdx.e.a.a.j.a(Unknown Source)
            at com.badlogic.gdx.utils.k.a(Unknown Source)
            at com.badlogic.gdx.e.a.a.i.a(Unknown Source)
            at com.badlogic.gdx.e.a.a.i.<init>(Unknown Source)
            at net.mygdx.game.a.a(Unknown Source)
            at com.badlogic.gdx.backends.android.i.onSurfaceChanged(Unknown Source)
            at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1520)
            at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1248)
 Caused by: java.lang.ClassNotFoundException: com.badlogic.gdx.graphics.g2d.BitmapFont
        at java.lang.Class.classForName(Native Method)
        at java.lang.Class.forName(Class.java:251)
        at java.lang.Class.forName(Class.java:216)
            at com.badlogic.gdx.utils.b.b.a(Unknown Source)
            at com.badlogic.gdx.e.a.a.k.a(Unknown Source)
            at com.badlogic.gdx.e.a.a.k.b(Unknown Source)
            at com.badlogic.gdx.utils.k.a(Unknown Source)
            at com.badlogic.gdx.e.a.a.j.a(Unknown Source)
            at com.badlogic.gdx.utils.k.a(Unknown Source)
            at com.badlogic.gdx.e.a.a.i.a(Unknown Source)
            at com.badlogic.gdx.e.a.a.i.<init>(Unknown Source)
            at net.mygdx.game.a.a(Unknown Source)
            at com.badlogic.gdx.backends.android.i.onSurfaceChanged(Unknown Source)
            at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1520)
            at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1248)
 Caused by: java.lang.NoClassDefFoundError: com/badlogic/gdx/graphics/g2d/BitmapFont
            at java.lang.Class.classForName(Native Method)
            at java.lang.Class.forName(Class.java:251)
            at java.lang.Class.forName(Class.java:216)
            at com.badlogic.gdx.utils.b.b.a(Unknown Source)
            at com.badlogic.gdx.e.a.a.k.a(Unknown Source)
            at com.badlogic.gdx.e.a.a.k.b(Unknown Source)
            at com.badlogic.gdx.utils.k.a(Unknown Source)
            at com.badlogic.gdx.e.a.a.j.a(Unknown Source)
            at com.badlogic.gdx.utils.k.a(Unknown Source)
            at com.badlogic.gdx.e.a.a.i.a(Unknown Source)
            at com.badlogic.gdx.e.a.a.i.<init>(Unknown Source)
            at org.mygdx.gam.a.a(Unknown Source)
            at com.badlogic.gdx.backends.android.i.onSurfaceChanged(Unknown Source)
            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.badlogic.gdx.graphics.g2d.BitmapFont" on path: DexPathList[[zip file "/data/app/org.mygdx.gam.android-1.apk"],nativeLibraryDirectories=[/data/app-lib/org.mygdx.gam.android-1, /vendor/lib, /system/lib]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
            at java.lang.Class.classForName(Native Method)
            at java.lang.Class.forName(Class.java:251)
            at java.lang.Class.forName(Class.java:216)
            at com.badlogic.gdx.utils.b.b.a(Unknown Source)
            at com.badlogic.gdx.e.a.a.k.a(Unknown Source)
            at com.badlogic.gdx.e.a.a.k.b(Unknown Source)
            at com.badlogic.gdx.utils.k.a(Unknown Source)
            at com.badlogic.gdx.e.a.a.j.a(Unknown Source)
            at com.badlogic.gdx.utils.k.a(Unknown Source)
            at com.badlogic.gdx.e.a.a.i.a(Unknown Source)
            at com.badlogic.gdx.e.a.a.i.<init>(Unknown Source)
            at org.mygdx.gam.a.a(Unknown Source)
            at com.badlogic.gdx.backends.android.i.onSurfaceChanged(Unknown Source)
            at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1520)
            at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1248)
这些行是很奇怪的,因为如果我去掉它们,程序运行得很好,除了明显没有出现的按钮

skin = new Skin(Gdx.files.internal("jsonSkin.json"));
TextButton btnStart = new TextButton("Start!!", skin);
btnStart.setPosition(50f,400f);
btnStart.setSize(260f,60f);
mainMenu.addActor(btnStart);

将其放入您的配置中:

 -keep class com.badlogic.**{
   **[] $VALUES;
    *;
}
它将修复此问题,以及反射问题

编辑: 上面是一条顶级规则,它在特定的包上禁用所有的
ProGuard的
goodness。不收缩,不模糊;不适用于类,不适用于成员

Proguard
混淆我们在皮肤文件中使用的类,
skin
通过反射加载类,因此我们必须不允许
Proguard
更改这些类的名称

  • 包中的双星号表示该顶级包下每个包下的每个类
  • 花括号内的星号适用于这些类中的每个成员(变量、方法和常量)

  • 问题是json序列化程序需要精确的字段名来完成其工作

    Abhishek是正确的,但我只需要忽略scene2d包的收缩,所以我把它放在proguard rules.pro文件中

     -keep class com.badlogic.gdx.scenes.scene2d.ui.**{
        **[] $VALUES;
         *;
     }
    
    它将优化除皮肤加载程序及其组件之外的所有其他代码

    如果您正在使用自己的类进行json反序列化,还需要放置类似的内容

     -keep class com.your.game.data.**{
        **[] $VALUES;
         *;
     }
    
    下面是一个屏幕截图,可以在Android Studio上为初学者找到proguard rules.pro文件

    将其放入您的程序规则中


    -保留类com.badlogic.gdx.graphics.g2d.BitmapFont

    看起来你的Proguard配置并不例外libgdx类。由于Skin通过反射加载类,你不能允许Proguard更改这些类的名称。你确定存在吗?
    skins/jsonSkin.json
    Menno-Gouw——我在这里发布时可能已经更改了一些内容,但是我可以告诉你,我把一个jsonSkin.json也放在皮肤/文件夹和资产中。请
    -Tenfour-\ucode>你能告诉我更多关于如何不允许proguard更改名称的信息吗???我禁用了proguard,但仍然有一个错误,请有人帮忙???那么这行代码到底在做什么?我对proguard很陌生,这看起来像是一个巨大的错误几乎所有内容都使用通配符。在这种情况下,Proguard只用于模糊处理,而不用于缩小和减小文件大小。I+1,但如果您详细说明一下,那就太好了。@Madmenyo我添加了一些更详细的信息,上面的规则是在libgdx包上禁用Proguard,但您自己的类仍然是安全的(模糊处理)如果您更关心模糊处理,您可以更深入地在
    com.badlogic.gdx.scenes.scene2d.ui
    上禁用模糊处理,并添加一些外部类,如
    BitmapFont
    Color
    ,这些可能是您在皮肤文件中使用的。
     -keep class com.your.game.data.**{
        **[] $VALUES;
         *;
     }