【问题标题】:Scala reflection java.rmi dependency, can it work on Android?Scala反射java.rmi依赖,可以在Android上运行吗?
【发布时间】:2017-03-04 17:12:40
【问题描述】:

我想在使用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 的代码,即JavaUniverseJavaUniverse 类中混合的特征)force 方法:

...
definitions.RemoteInterfaceClass
...

这导致DefinitionsClass

lazy val RemoteInterfaceClass  = requiredClass[java.rmi.Remote]

我认为这在 Android 中不能使用 Scala 反射是不是错了? 如果是,有什么办法可以解决这个问题?

【问题讨论】:

  • 您找到解决此问题的方法了吗?

标签: android scala reflection dependencies rmi


【解决方案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 {}

【讨论】:

  • 感谢总结,我还没有零钱自己回答。我要补充一点,我必须向 DEX 生成器添加几个附加参数:dexMaxHeap in Android :="4096M"dexMulti in Android := true 这里github.com/pfcoperez/android_scalarpel/blob/master/build.sbt 你可以找到该项目,如果它已被应用,它现在已经被放弃了,但我希望我可以继续使用它很快。
  • 另外,你应该记住(我会在答案中添加一个警告)这是一个“肮脏”的黑客攻击,sbt-android 维护者警告不要在这种情况下使用 Java 反射。
  • 我会赞成这个肮脏的,感觉不对。不过,有时别无选择。例如,就我而言,我依赖于广泛使用反射的第三方库。
猜你喜欢
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
  • 2014-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
相关资源
最近更新 更多