使用 IntelliJ 在 Android 上用 Scala 编写的 LibGDX 项目

Posted

技术标签:

【中文标题】使用 IntelliJ 在 Android 上用 Scala 编写的 LibGDX 项目【英文标题】:LibGDX project written in Scala, on Android, using IntelliJ 【发布时间】:2013-12-21 16:08:36 【问题描述】:

因此,在使用本教程进行设置后,我一直在使用 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项目。然而,每当我尝试这个时,我都会收到一个错误,即我有太多方法,(similar to this) 这很有意义,因为 Scala 在项目中引入了足够多的方法来保证这个错误。

我的问题是如何让 android 项目了解 Scala 类和方法,以便在 android 项目中像在桌面项目中一样有效地使用它们?

谢谢!

【问题讨论】:

【参考方案1】:

好的,看来我已经能够解决我的问题了。

我能够使用 ProGuard 来减少我的项目使用的方法,并且 Scala 现在可以在 android 上按预期运行。实际上,我在使用 LibGDX 本身时遇到了一些障碍,但设法弄清楚如何将其添加到配置中。 (with a little help from google of course)

对于遇到相同问题的其他人,这是我的 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 *;

【讨论】:

以上是关于使用 IntelliJ 在 Android 上用 Scala 编写的 LibGDX 项目的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 上用您自己的替换 firebase 通知?

为啥我不能在 Android 上用 Java 解压这个 LZW 文件?

poi的xwpf可以在android上用吗

Android TV 应用程序的持续状态? (在Android上用啥代替通知栏)

iPhone上用的NVMe闪存,与Android旗舰上用的UFS2.1闪存,各自的优劣是什么?

在 Apple 芯片设备上用 Android Studio?别忘了使用 Apple 芯片预览版!