我想在使用Scala on android构建的用于android的Scala应用程序中使用Scala(2.11)反射包的运行时镜像。
我能够使用ProGuard选项,以使其包含所需的Scala类。但是,当我尝试获取镜像实例时:
universe.runtimeMirror(this.getClass.getClassLoader)
(实际上它在universe
)的懒惰计算期间失败了
应用程序在运行时崩溃:
java.lang.NoClassDefFoundError: Failed resolution of: Ljava/rmi/Remote;
at scala.reflect.internal.Definitions$DefinitionsClass.RemoteInterfaceClass$lzycompute(Definitions.scala:370)
at scala.reflect.internal.Definitions$DefinitionsClass.RemoteInterfaceClass(D efinitions.scala:370)
at scala.reflect.runtime.JavaUniverseForce$class.force(JavaUniverseForce.scal a:255)
at scala.reflect.runtime.JavaUniverse.force(JavaUniverse.scala:16)
at scala.reflect.runtime.JavaUniverse.init(JavaUniverse.scala:147)
at scala.reflect.runtime.JavaUniverse.<init>(JavaUniverse.scala:78)
at scala.reflect.runtime.package$.universe$lzycompute(package.scala:17)
at scala.reflect.runtime.package$.universe(package.scala:17)
这次崩溃对我来说是预期的,因为它不是:
预计因为java.rmi
不是Android API的一部分,我应该期待任何代码尝试加载其崩溃的类。
出乎意料,因为我不知道Scala反映使用的包java.rmi
我已经跟踪了代码,rmi
是必需的,即JavaUniverse
(混合在JavaUniverse
类)force
方法中的特征:
...
definitions.RemoteInterfaceClass
...
导致DefinitionsClass
:
lazy val RemoteInterfaceClass = requiredClass[java.rmi.Remote]
我认为这对Android中的Scala反射是不合适的吗? 如果我是,那么这个问题的解决办法是什么?
答案 0 :(得分:1)
要总结your solution和related solution,只需添加两个文件,然后修改build.sbt
即可包含:
dexAdditionalParams in Android += "--core-library"
使用内容
将java/rmi/Remote.java
添加到项目中
package java.rmi;
public interface Remote {}
使用内容
将java/rmi/RemoteException.java
添加到项目中
package java.rmi;
public interface RemoteException {}