Scala 反射 java.rmi 依赖,它可以在 Android 上工作吗?
Scala reflection java.rmi dependency, can it work on Android?
我想在为 android 编译的 Scala 应用程序中使用 Scala (2.11) 反射包的 运行time 镜像,该应用程序正在使用 Scala on android 构建。
我能够 fiddle 使用 ProGuard 选项以使其包含所需的 Scala classes。但是,当我尝试获取镜像实例时:
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 的一部分,我应该期望任何代码试图加载它的 classes 崩溃。
没想到因为我不知道Scala的reflect包用了java.rmi
我追踪代码发现 rmi
是必需的,即 JavaUniverse
(JavaUniverse
class 中混合的特征)force
方法:
...
definitions.RemoteInterfaceClass
...
这导致 DefinitionsClass
:
lazy val RemoteInterfaceClass = requiredClass[java.rmi.Remote]
我认为在 Android 中不能使用 Scala 反射,我错了吗?
如果是,有什么方法可以解决此问题?
总结your solution and a 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 {}
我想在为 android 编译的 Scala 应用程序中使用 Scala (2.11) 反射包的 运行time 镜像,该应用程序正在使用 Scala on android 构建。
我能够 fiddle 使用 ProGuard 选项以使其包含所需的 Scala classes。但是,当我尝试获取镜像实例时:
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 的一部分,我应该期望任何代码试图加载它的 classes 崩溃。
没想到因为我不知道Scala的reflect包用了java.rmi
我追踪代码发现 rmi
是必需的,即 JavaUniverse
(JavaUniverse
class 中混合的特征)force
方法:
...
definitions.RemoteInterfaceClass
...
这导致 DefinitionsClass
:
lazy val RemoteInterfaceClass = requiredClass[java.rmi.Remote]
我认为在 Android 中不能使用 Scala 反射,我错了吗? 如果是,有什么方法可以解决此问题?
总结your solution and a 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 {}