因此,在使用本教程进行设置后,我一直在使用Scala在IntelliJ v12.1.6中开发LibGDX项目: http ://www.gamefromscratch.com/post/2013/12/01/Using-LibGDX-with-IntelliJ -with-Gradle.aspx 。 不过,我注意到,在Android设备上测试游戏时,我收到以下错误消息
12-04 17:46:22.483: ERROR/AndroidRuntime(18951): FATAL EXCEPTION: GLThread 475 Process: com.voliant.rsoss, PID: 18951 java.lang.NoClassDefFoundError: scala.Predef$ at com.voliant.rsoss.Actors.Player.act(Player.scala:20) at com.badlogic.gdx.scenes.scene2d.Group.act(Group.java:48) at com.badlogic.gdx.scenes.scene2d.Stage.act(Stage.java:225) at com.badlogic.gdx.scenes.scene2d.Stage.act(Stage.java:189) at com.voliant.rsoss.Screens.GameScreen.render(GameScreen.scala:46) at com.badlogic.gdx.Game.render(Game.java:46) at com.badlogic.gdx.backends.android.AndroidGraphics.onDrawFrame(AndroidGraphics.java:499) at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1523) at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240)每当我尝试使用Scala本地方法(如标准println()方法)时。
我怀疑android类找不到Scala使用的类,所以我试图用Scala库导出android项目。 然而,每当我尝试这个,我得到一个错误,我有太多的方法, (类似于这个) ,这是有道理的,因为斯卡拉在项目中引入了足够多的方法来保证这个错误。
我的问题是我怎样才能让android项目意识到Scala类和方法,以便我可以像在桌面项目中一样有效地在android项目中使用它们?
谢谢!
So I've been working on a LibGDX project in IntelliJ v12.1.6 using Scala after getting set up using this tutorial: http://www.gamefromscratch.com/post/2013/12/01/Using-LibGDX-with-IntelliJ-with-Gradle.aspx. However I've noticed, when testing the game on my android device, I receive the following error
12-04 17:46:22.483: ERROR/AndroidRuntime(18951): FATAL EXCEPTION: GLThread 475 Process: com.voliant.rsoss, PID: 18951 java.lang.NoClassDefFoundError: scala.Predef$ at com.voliant.rsoss.Actors.Player.act(Player.scala:20) at com.badlogic.gdx.scenes.scene2d.Group.act(Group.java:48) at com.badlogic.gdx.scenes.scene2d.Stage.act(Stage.java:225) at com.badlogic.gdx.scenes.scene2d.Stage.act(Stage.java:189) at com.voliant.rsoss.Screens.GameScreen.render(GameScreen.scala:46) at com.badlogic.gdx.Game.render(Game.java:46) at com.badlogic.gdx.backends.android.AndroidGraphics.onDrawFrame(AndroidGraphics.java:499) at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1523) at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240)Whenever I attempt to utilize a method that's native to Scala (such as the standard println() method).
I suspected that the android class could not find the classes utilized by Scala, so I attempted to export the android project with the Scala library. Whenever I try this however, I get an error that I have too many methods, (similar to this) which would make sense as Scala introduces well over enough methods into the project to warrant this error.
My question is how could I make the android project aware of the Scala classes and methods, so that I could use them as effectively in the android project as I have been able to in the desktop project?
Thanks!
最满意答案
好吧,看来我已经能够解决我的问题了。
我能够使用ProGuard减少我的项目使用的方法,Scala现在可以按照预期在android上运行。 我遇到了一些与LibGDX本身实际上的矛盾,但设法弄清楚如何将它添加到配置。 (当然有一点谷歌的帮助)
对于有同样问题的其他人,这里是我用来帮助提出解决方案的ProGuard cfg和链接。 快乐编码!
https://github.com/yareally/android-scala-intellij-no-sbt-plugin
-dontwarn scala.** -dontwarn java.awt.** -dontnote java.awt.** -dontwarn com.badlogic.gdx.jnigen.** -dontwarn com.badlogic.gdx.backends.android.AndroidDaydream -dontwarn com.badlogic.gdx.backends.android.AndroidInputThreePlus -dontwarn com.badlogic.gdx.backends.android.AndroidGraphicsDaydream -keepclasseswithmembers public class * { public static void main(java.lang.String[]); } -keep class * implements org.xml.sax.EntityResolver -keepclassmembers class * { ** MODULE$; } -keepclassmembernames class scala.concurrent.forkjoin.ForkJoinPool { long eventCount; int workerCounts; int runControl; scala.concurrent.forkjoin.ForkJoinPool$WaitQueueNode syncStack; scala.concurrent.forkjoin.ForkJoinPool$WaitQueueNode spareStack; } -keepclassmembernames class scala.concurrent.forkjoin.ForkJoinWorkerThread { int base; int sp; int runState; } -keepclassmembernames class scala.concurrent.forkjoin.ForkJoinTask { int status; } -keepclassmembernames class scala.concurrent.forkjoin.LinkedTransferQueue { scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference head; scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference tail; scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference cleanMe; } -keep class com.badlogic.gdx.backends.android.AndroidInput { public protected private *; } -keep class com.badlogic.gdx.backends.android.AndroidInputFactory { public protected private *; } -keep class com.badlogic.gdx.backends.android.AndroidInputThreePlus { public protected private *; } -keep class com.badlogic.gdx.backends.android.AndroidApplicationConfiguration { public protected private *; } -keepclasseswithmembernames class * { native <methods>; } -keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet); } -keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet, int); } -keepclassmembers class * extends android.app.Activity { public void *(android.view.View); } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; }Alright, It appears I've been able to resolve my issue.
I was able to use ProGuard to cut down the methods used by my projects, and Scala is now operating as expected on android. I ran into a bit of a snag with LibGDX itself actually, but managed to figure out how to add it to the config as well. (with a little help from google of course)
For anyone else who has the same problem, here's my ProGuard cfg and links I used to help come up with a solution. Happy Coding!
https://github.com/yareally/android-scala-intellij-no-sbt-plugin
-dontwarn scala.** -dontwarn java.awt.** -dontnote java.awt.** -dontwarn com.badlogic.gdx.jnigen.** -dontwarn com.badlogic.gdx.backends.android.AndroidDaydream -dontwarn com.badlogic.gdx.backends.android.AndroidInputThreePlus -dontwarn com.badlogic.gdx.backends.android.AndroidGraphicsDaydream -keepclasseswithmembers public class * { public static void main(java.lang.String[]); } -keep class * implements org.xml.sax.EntityResolver -keepclassmembers class * { ** MODULE$; } -keepclassmembernames class scala.concurrent.forkjoin.ForkJoinPool { long eventCount; int workerCounts; int runControl; scala.concurrent.forkjoin.ForkJoinPool$WaitQueueNode syncStack; scala.concurrent.forkjoin.ForkJoinPool$WaitQueueNode spareStack; } -keepclassmembernames class scala.concurrent.forkjoin.ForkJoinWorkerThread { int base; int sp; int runState; } -keepclassmembernames class scala.concurrent.forkjoin.ForkJoinTask { int status; } -keepclassmembernames class scala.concurrent.forkjoin.LinkedTransferQueue { scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference head; scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference tail; scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference cleanMe; } -keep class com.badlogic.gdx.backends.android.AndroidInput { public protected private *; } -keep class com.badlogic.gdx.backends.android.AndroidInputFactory { public protected private *; } -keep class com.badlogic.gdx.backends.android.AndroidInputThreePlus { public protected private *; } -keep class com.badlogic.gdx.backends.android.AndroidApplicationConfiguration { public protected private *; } -keepclasseswithmembernames class * { native <methods>; } -keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet); } -keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet, int); } -keepclassmembers class * extends android.app.Activity { public void *(android.view.View); } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; }在Android上使用IntelliJ编写的Scala中的LibGDX项目(LibGDX project written in Scala, on Android, using IntelliJ) java因此,在使用本教程进行设置后,我一直在使用Scala在IntelliJ v12.1.6中开发LibGDX项目: http ://www.gamefromscratch.com/post/2013/12/01/Using-LibGDX-with-IntelliJ -with-Gradle.aspx 。 不过,我注意到,在Android设备上测试游戏时,我收到以下错误消息
12-04 17:46:22.483: ERROR/AndroidRuntime(18951): FATAL EXCEPTION: GLThread 475 Process: com.voliant.rsoss, PID: 18951 java.lang.NoClassDefFoundError: scala.Predef$ at com.voliant.rsoss.Actors.Player.act(Player.scala:20) at com.badlogic.gdx.scenes.scene2d.Group.act(Group.java:48) at com.badlogic.gdx.scenes.scene2d.Stage.act(Stage.java:225) at com.badlogic.gdx.scenes.scene2d.Stage.act(Stage.java:189) at com.voliant.rsoss.Screens.GameScreen.render(GameScreen.scala:46) at com.badlogic.gdx.Game.render(Game.java:46) at com.badlogic.gdx.backends.android.AndroidGraphics.onDrawFrame(AndroidGraphics.java:499) at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1523) at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240)每当我尝试使用Scala本地方法(如标准println()方法)时。
我怀疑android类找不到Scala使用的类,所以我试图用Scala库导出android项目。 然而,每当我尝试这个,我得到一个错误,我有太多的方法, (类似于这个) ,这是有道理的,因为斯卡拉在项目中引入了足够多的方法来保证这个错误。
我的问题是我怎样才能让android项目意识到Scala类和方法,以便我可以像在桌面项目中一样有效地在android项目中使用它们?
谢谢!
So I've been working on a LibGDX project in IntelliJ v12.1.6 using Scala after getting set up using this tutorial: http://www.gamefromscratch.com/post/2013/12/01/Using-LibGDX-with-IntelliJ-with-Gradle.aspx. However I've noticed, when testing the game on my android device, I receive the following error
12-04 17:46:22.483: ERROR/AndroidRuntime(18951): FATAL EXCEPTION: GLThread 475 Process: com.voliant.rsoss, PID: 18951 java.lang.NoClassDefFoundError: scala.Predef$ at com.voliant.rsoss.Actors.Player.act(Player.scala:20) at com.badlogic.gdx.scenes.scene2d.Group.act(Group.java:48) at com.badlogic.gdx.scenes.scene2d.Stage.act(Stage.java:225) at com.badlogic.gdx.scenes.scene2d.Stage.act(Stage.java:189) at com.voliant.rsoss.Screens.GameScreen.render(GameScreen.scala:46) at com.badlogic.gdx.Game.render(Game.java:46) at com.badlogic.gdx.backends.android.AndroidGraphics.onDrawFrame(AndroidGraphics.java:499) at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1523) at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240)Whenever I attempt to utilize a method that's native to Scala (such as the standard println() method).
I suspected that the android class could not find the classes utilized by Scala, so I attempted to export the android project with the Scala library. Whenever I try this however, I get an error that I have too many methods, (similar to this) which would make sense as Scala introduces well over enough methods into the project to warrant this error.
My question is how could I make the android project aware of the Scala classes and methods, so that I could use them as effectively in the android project as I have been able to in the desktop project?
Thanks!
最满意答案
好吧,看来我已经能够解决我的问题了。
我能够使用ProGuard减少我的项目使用的方法,Scala现在可以按照预期在android上运行。 我遇到了一些与LibGDX本身实际上的矛盾,但设法弄清楚如何将它添加到配置。 (当然有一点谷歌的帮助)
对于有同样问题的其他人,这里是我用来帮助提出解决方案的ProGuard cfg和链接。 快乐编码!
https://github.com/yareally/android-scala-intellij-no-sbt-plugin
-dontwarn scala.** -dontwarn java.awt.** -dontnote java.awt.** -dontwarn com.badlogic.gdx.jnigen.** -dontwarn com.badlogic.gdx.backends.android.AndroidDaydream -dontwarn com.badlogic.gdx.backends.android.AndroidInputThreePlus -dontwarn com.badlogic.gdx.backends.android.AndroidGraphicsDaydream -keepclasseswithmembers public class * { public static void main(java.lang.String[]); } -keep class * implements org.xml.sax.EntityResolver -keepclassmembers class * { ** MODULE$; } -keepclassmembernames class scala.concurrent.forkjoin.ForkJoinPool { long eventCount; int workerCounts; int runControl; scala.concurrent.forkjoin.ForkJoinPool$WaitQueueNode syncStack; scala.concurrent.forkjoin.ForkJoinPool$WaitQueueNode spareStack; } -keepclassmembernames class scala.concurrent.forkjoin.ForkJoinWorkerThread { int base; int sp; int runState; } -keepclassmembernames class scala.concurrent.forkjoin.ForkJoinTask { int status; } -keepclassmembernames class scala.concurrent.forkjoin.LinkedTransferQueue { scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference head; scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference tail; scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference cleanMe; } -keep class com.badlogic.gdx.backends.android.AndroidInput { public protected private *; } -keep class com.badlogic.gdx.backends.android.AndroidInputFactory { public protected private *; } -keep class com.badlogic.gdx.backends.android.AndroidInputThreePlus { public protected private *; } -keep class com.badlogic.gdx.backends.android.AndroidApplicationConfiguration { public protected private *; } -keepclasseswithmembernames class * { native <methods>; } -keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet); } -keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet, int); } -keepclassmembers class * extends android.app.Activity { public void *(android.view.View); } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; }Alright, It appears I've been able to resolve my issue.
I was able to use ProGuard to cut down the methods used by my projects, and Scala is now operating as expected on android. I ran into a bit of a snag with LibGDX itself actually, but managed to figure out how to add it to the config as well. (with a little help from google of course)
For anyone else who has the same problem, here's my ProGuard cfg and links I used to help come up with a solution. Happy Coding!
https://github.com/yareally/android-scala-intellij-no-sbt-plugin
-dontwarn scala.** -dontwarn java.awt.** -dontnote java.awt.** -dontwarn com.badlogic.gdx.jnigen.** -dontwarn com.badlogic.gdx.backends.android.AndroidDaydream -dontwarn com.badlogic.gdx.backends.android.AndroidInputThreePlus -dontwarn com.badlogic.gdx.backends.android.AndroidGraphicsDaydream -keepclasseswithmembers public class * { public static void main(java.lang.String[]); } -keep class * implements org.xml.sax.EntityResolver -keepclassmembers class * { ** MODULE$; } -keepclassmembernames class scala.concurrent.forkjoin.ForkJoinPool { long eventCount; int workerCounts; int runControl; scala.concurrent.forkjoin.ForkJoinPool$WaitQueueNode syncStack; scala.concurrent.forkjoin.ForkJoinPool$WaitQueueNode spareStack; } -keepclassmembernames class scala.concurrent.forkjoin.ForkJoinWorkerThread { int base; int sp; int runState; } -keepclassmembernames class scala.concurrent.forkjoin.ForkJoinTask { int status; } -keepclassmembernames class scala.concurrent.forkjoin.LinkedTransferQueue { scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference head; scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference tail; scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference cleanMe; } -keep class com.badlogic.gdx.backends.android.AndroidInput { public protected private *; } -keep class com.badlogic.gdx.backends.android.AndroidInputFactory { public protected private *; } -keep class com.badlogic.gdx.backends.android.AndroidInputThreePlus { public protected private *; } -keep class com.badlogic.gdx.backends.android.AndroidApplicationConfiguration { public protected private *; } -keepclasseswithmembernames class * { native <methods>; } -keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet); } -keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet, int); } -keepclassmembers class * extends android.app.Activity { public void *(android.view.View); } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; }
发布评论