我在eclipse中有一个libgdx android项目,我已经添加了scala和AndroidProguardScala属性。这个工作得很好,但是突然eclipse开始给我警告"在构建路径上发现了多个Scala库"。我仍然可以在设备上构建和安装项目,但它会立即退出NoClassDefFoundError: scala.Tuple2$mcZZ$sp
, 所以看起来Scala库根本不包括在内。
我的项目似乎在"Scala库[2.10.1]"(作为"Scala -library.jar")和"Android依赖项"(作为"scala_library.min.jar")下都有Scala库,所以我猜Proguard输出与原始库冲突,但我不知道为什么会发生这种情况或如何修复它。
在这一点上,我可以只是做一个新的项目,并复制源文件,但这将是伟大的,如果有人能说明这一点。
编辑:经过一些实验证明,这段代码(从一个trait的方法内)似乎是导致问题的原因。
acckeys match {
case (true, false) => acceleration.set(0, accel).rotate(rotation)
case (false, true) => acceleration.set(0, -accel).rotate(rotation)
case _ => acceleration.set(0, 0)
}
(acckeys是返回tuple
的函数,acceleration
是一个向量)
多重库警告仍然存在,所以我想这与问题无关。幸运的是,我实际上不需要从项目的android版本引用这段代码,但知道为什么这段代码编译但未能运行仍然是有用的。
我完全知道你有什么问题。这与AndroidProgaurdScala不能识别主项目中的类文件有关。结果是,在android项目中定义的任何类都包括在内,但任何"新"的,比如你的元组,将会丢失,因为你得到了美妙的NoClassDefFoundError。我没有遇到过"在构建路径上找到多个Scala库"的警告,但这可能意味着您将Scala属性添加到项目中,并在其上添加了library.jar。试着撤销你的配置,并按照我下面所做的;否则,按照下面的步骤创建一个新项目,然后复制源代码。
我发现Scala Nature和Android Proguard Scala在运行了一个淤泥之后修复有点痛苦。我不能百分百肯定你能挽救一个现有的项目,但我们可以试着看看会发生什么。首先,从项目中删除所有与scala相关的属性,并将它们恢复到原始状态,就像在一个普通的旧Java项目中一样。
让我们从头开始用Scala设置libGDX,看看哪里出了问题:
- 确保您的环境设置正确。(注意:您需要获取最新版本) 正常设置libGDX项目。(或在您的情况下使用现有项目)
- 右键单击android项目,"Add Scala nature",然后"Add AndroidProgaurdScala nature" 右键单击主项目"Add Scala nature"
- 右键单击桌面项目,"Add Scala nature"
现在,这可能是你已经得到的地方,但仍然有AndroidProgaurdScala不知道你在主项目中有什么类的问题。它似乎忽略了包含的项目,并且没有将它们添加到scala_library.min.jar中。为了解决这个问题,我找到了一个很好的解决方案:
- 右键单击Android Project> Properties> Java Build Path
- 转到Projects选项卡,删除主项目。我知道这是违反直觉的,但是相信我。
- 进入源选项卡>链接源… 在主项目中导航并选择"src"文件夹
- 按OK
- 清理和重建项目。
这个设置我已经测试并广泛使用,没有任何问题。Android和桌面版本都很好,使用Scala或混合代码时没有任何抱怨。android项目现在完全知道你在主项目中使用的所有Scala类,因为源代码现在被复制到android项目的构建中。(也就是说,任何与Scala相关的东西都不应该出现NoClassDefFoundError)。
当我的Proguard配置文件有问题时,我得到了类似的消息。您可以检查:
- Proguard是否正在运行 你的配置文件中有:-keep public class **. yourpackage。**或类似的东西
你的配置文件被修改为Scala库,例如
<>之前& # 35; & # 35;SCALA的设置-dontwarn anonfun美元美元* * *-dontwarn scala.android。* *-dontwarn scala.beans.ScalaBeanInfo-dontwarn scala.collection.generic.GenTraversableFactory-dontwarn scala.collection.immutable.RedBlack美元空-dontwarn scala.concurrent.forkjoin。* *-dontwarn scala.reflect。* *-dontwarn scala.sys.process。* *plugintemplate -dontwarn scala.tools。* *。* *& # 35; (org.xml.sax.EntityResolver) forname(变量).newInstance ()-dontnote org.xml.sax.EntityResolver& # 35; (org.apache.james.mime4j.storage.StorageProvider) forname(变量).newInstance ()-dontnote org.apache.james.mime4j.storage.DefaultStorageProvider-dontnote scala.android.app.Activity保持类scala.android.package**-keep类*扩展scala.android.app.Activity& # 35; & # 35;修复==>警告:…找不到引用类sun.misc.不安全-libraryjars D:Program FilesApachem2repositorycomgooglecodefindbugsjsr3052.0.1jsr305-2.0.1.jar-dontwarn sun.misc.Unsafekeep类*扩展scala.runtime.MethodCache {公众的;}-keepclassmembers类* {美元* *模块;}-keepclassmembernames类scala.concurrent.forkjoin.ForkJoinPool {长eventCount;int workerCounts;int runControl;scala.concurrent.forkjoin。美元ForkJoinPool WaitQueueNode syncStack;scala.concurrent.forkjoin。美元ForkJoinPool WaitQueueNode spareStack;}-keepclassmembernames类scala.concurrent.forkjoin.ForkJoinWorkerThread {int基地;int sp;int runState;}-keepclassmembernames类scala.concurrent.forkjoin.ForkJoinTask {int状态;}-keepclassmembernames类scala.concurrent.forkjoin.LinkedTransferQueue {scala.concurrent.forkjoin。美元LinkedTransferQueue PaddedAtomicReference头;scala.concurrent.forkjoin。美元LinkedTransferQueue PaddedAtomicReference尾巴;scala.concurrent.forkjoin。美元LinkedTransferQueue PaddedAtomicReference cleanMe;}