Scala反射java.rmi依赖,可以在Android上运行吗?

时间:2017-03-04 17:12:41

标签: android scala reflection dependencies rmi

我想在使用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反射是不合适的吗? 如果我是,那么这个问题的解决办法是什么?

1 个答案:

答案 0 :(得分:1)

要总结your solutionrelated 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 {}