Java LibGdx[致命异常]加载skin.json文件
我在用Intellij。一切正常,APK部署在我的Android系统中,但它只是停留在黑屏上,回到家里说“‘游戏’停止了: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
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;
*;
}