android - 在 Android : "can' t load this type of class file"上运行 Clojure

标签 android gradle clojure jvm javafxports

我正在尝试让 Clojure 和 JavaFXPorts 在 Android 上运行。但它在启动时崩溃并显示以下堆栈跟踪。我对 JVM 内部知识知之甚少,所以我不知道为什么会发生这种特殊的 UnsupportedOperationException。我的假设是 Clojure 使用它的编译器注册了一个新的类文件类型,并且出于某种原因这在 Android 上失败了 - 至少与 JavaFXPorts 结合使用(我没有尝试创建没有 JavaFXPorts 的 Android 应用程序;我将需要它无论如何)。

10-30 19:00:24.450 11088 11130 W System.err: java.lang.reflect.InvocationTargetException
10-30 19:00:24.450 11088 11130 W System.err:    at java.lang.reflect.Method.invoke(Native Method)
10-30 19:00:24.450 11088 11130 W System.err:    at javafxports.android.DalvikLauncher$1.run(DalvikLauncher.java:188)
10-30 19:00:24.451 11088 11130 W System.err:    at java.lang.Thread.run(Thread.java:761)
10-30 19:00:24.452 11088 11130 W System.err: Caused by: java.lang.RuntimeException: Unable to construct Application instance: class lyrion.cec.core
10-30 19:00:24.452 11088 11130 W System.err:    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:907)
10-30 19:00:24.452 11088 11130 W System.err:    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$138(LauncherImpl.java:182)
10-30 19:00:24.453 11088 11130 W System.err:    at com.sun.javafx.application.LauncherImpl.access$lambda$1(LauncherImpl.java)
10-30 19:00:24.453 11088 11130 W System.err:    at com.sun.javafx.application.LauncherImpl$$Lambda$2.run(Unknown Source)
10-30 19:00:24.453 11088 11130 W System.err:    ... 1 more
10-30 19:00:24.454 11088 11130 W System.err: Caused by: java.lang.ExceptionInInitializerError
10-30 19:00:24.454 11088 11130 W System.err:    at java.lang.Class.classForName(Native Method)
10-30 19:00:24.454 11088 11130 W System.err:    at java.lang.Class.forName(Class.java:400)
10-30 19:00:24.454 11088 11130 W System.err:    at clojure.lang.RT.classForName(RT.java:2204)
10-30 19:00:24.454 11088 11130 W System.err:    at clojure.lang.RT.classForName(RT.java:2213)
10-30 19:00:24.455 11088 11130 W System.err:    at clojure.lang.RT.loadClassForName(RT.java:2232)
10-30 19:00:24.455 11088 11130 W System.err:    at clojure.lang.RT.load(RT.java:450)
10-30 19:00:24.455 11088 11130 W System.err:    at clojure.lang.RT.load(RT.java:426)
10-30 19:00:24.455 11088 11130 W System.err:    at clojure.lang.RT.doInit(RT.java:468)
10-30 19:00:24.455 11088 11130 W System.err:    at clojure.lang.RT.<clinit>(RT.java:336)
10-30 19:00:24.455 11088 11130 W System.err:    at clojure.lang.Namespace.<init>(Namespace.java:34)
10-30 19:00:24.456 11088 11130 W System.err:    at clojure.lang.Namespace.findOrCreate(Namespace.java:176)
10-30 19:00:24.456 11088 11130 W System.err:    at clojure.lang.Var.internPrivate(Var.java:153)
10-30 19:00:24.456 11088 11130 W System.err:    at lyrion.cec.core.<clinit>(Unknown Source)
10-30 19:00:24.456 11088 11130 W System.err:    at java.lang.reflect.Constructor.newInstance0(Native Method)
10-30 19:00:24.456 11088 11130 W System.err:    at java.lang.reflect.Constructor.newInstance(Constructor.java:430)
10-30 19:00:24.456 11088 11130 W System.err:    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$144(LauncherImpl.java:819)
10-30 19:00:24.457 11088 11130 W System.err:    at com.sun.javafx.application.LauncherImpl.access$lambda$7(LauncherImpl.java)
10-30 19:00:24.457 11088 11130 W System.err:    at com.sun.javafx.application.LauncherImpl$$Lambda$8.run(Unknown Source)
10-30 19:00:24.457 11088 11130 W System.err:    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$158(PlatformImpl.java:326)
10-30 19:00:24.457 11088 11130 W System.err:    at com.sun.javafx.application.PlatformImpl.access$lambda$6(PlatformImpl.java)
10-30 19:00:24.457 11088 11130 W System.err:    at com.sun.javafx.application.PlatformImpl$$Lambda$7.run(Unknown Source)
10-30 19:00:24.457 11088 11130 W System.err:    at com.sun.javafx.application.PlatformImpl.lambda$null$156(PlatformImpl.java:295)
10-30 19:00:24.458 11088 11130 W System.err:    at com.sun.javafx.application.PlatformImpl.access$lambda$18(PlatformImpl.java)
10-30 19:00:24.458 11088 11130 W System.err:    at com.sun.javafx.application.PlatformImpl$$Lambda$19.run(Unknown Source)
10-30 19:00:24.458 11088 11130 W System.err:    at java.security.AccessController.doPrivileged(AccessController.java:57)
10-30 19:00:24.458 11088 11130 W System.err:    at com.sun.javafx.application.PlatformImpl.lambda$runLater$157(PlatformImpl.java:294)
10-30 19:00:24.458 11088 11130 W System.err:    at com.sun.javafx.application.PlatformImpl.access$lambda$5(PlatformImpl.java)
10-30 19:00:24.458 11088 11130 W System.err:    at com.sun.javafx.application.PlatformImpl$$Lambda$6.run(Unknown Source)
10-30 19:00:24.459 11088 11130 W System.err:    at com.sun.glass.ui.monocle.RunnableProcessor.runLoop(RunnableProcessor.java:93)
10-30 19:00:24.459 11088 11130 W System.err:    at com.sun.glass.ui.monocle.RunnableProcessor.run(RunnableProcessor.java:52)
10-30 19:00:24.459 11088 11130 W System.err:    ... 1 more
10-30 19:00:24.460 11088 11130 W System.err: Caused by: java.lang.UnsupportedOperationException: can't load this type of class file, compiling:(clojure/core_instant18.clj:9:1)
10-30 19:00:24.460 11088 11130 W System.err:    at clojure.lang.Compiler.analyzeSeq(Compiler.java:7010)
10-30 19:00:24.461 11088 11130 W System.err:    at clojure.lang.Compiler.analyze(Compiler.java:6773)
10-30 19:00:24.461 11088 11130 W System.err:    at clojure.lang.Compiler.eval(Compiler.java:7059)
10-30 19:00:24.461 11088 11130 W System.err:    at clojure.lang.Compiler.load(Compiler.java:7514)
10-30 19:00:24.493 11088 11130 W System.err:    at clojure.lang.RT.loadResourceScript(RT.java:379)
10-30 19:00:24.494 11088 11130 W System.err:    at clojure.lang.RT.loadResourceScript(RT.java:370)
10-30 19:00:24.494 11088 11130 W System.err:    at clojure.lang.RT.load(RT.java:460)
10-30 19:00:24.494 11088 11130 W System.err:    at clojure.lang.RT.load(RT.java:426)
10-30 19:00:24.494 11088 11130 W System.err:    at clojure.core$load$fn__6548.invoke(core.clj:6046)
10-30 19:00:24.494 11088 11130 W System.err:    at clojure.core$load.invokeStatic(core.clj:6045)
10-30 19:00:24.495 11088 11130 W System.err:    at clojure.core$load.doInvoke(core.clj:6029)
10-30 19:00:24.495 11088 11130 W System.err:    at clojure.lang.RestFn.invoke(RestFn.java:408)
10-30 19:00:24.495 11088 11130 W System.err:    at clojure.core$fn__8055.invokeStatic(core.clj:6709)
10-30 19:00:24.495 11088 11130 W System.err:    at clojure.core$fn__8055.invoke(core.clj:6708)
10-30 19:00:24.495 11088 11130 W System.err:    at clojure.core__init.load(Unknown Source)
10-30 19:00:24.495 11088 11130 W System.err:    at clojure.core__init.<clinit>(Unknown Source)
10-30 19:00:24.496 11088 11130 W System.err:    ... 31 more
10-30 19:00:24.497 11088 11130 W System.err: Caused by: java.lang.UnsupportedOperationException: can't load this type of class file
10-30 19:00:24.497 11088 11130 W System.err:    at java.lang.ClassLoader.defineClass(ClassLoader.java:520)
10-30 19:00:24.497 11088 11130 W System.err:    at clojure.lang.DynamicClassLoader.defineClass(DynamicClassLoader.java:46)
10-30 19:00:24.497 11088 11130 W System.err:    at clojure.lang.Compiler$ObjExpr.getCompiledClass(Compiler.java:4979)
10-30 19:00:24.498 11088 11130 W System.err:    at clojure.lang.Compiler$FnExpr.parse(Compiler.java:4109)
10-30 19:00:24.498 11088 11130 W System.err:    at clojure.lang.Compiler.analyzeSeq(Compiler.java:7001)
10-30 19:00:24.498 11088 11130 W System.err:    ... 46 more

最佳答案

首先是剧透:对于 Clojure,它已经完成了。

问题是 Clojure 有一个 DynamicClassLoader,您可能会猜到它会加载在运行时组成的类,而 Android 不支持它。事实上,您可以通过 ClassLoader.defineClass() 在 JVM 上执行此操作,但在 Android 上执行该方法只会抛出您看到的异常,这意味着 Clojure 甚至无法在 Android 上进行初始化。

另一个问题是,即使该方法可用,Android 也无法运行 Clojure 生成的 JVM 字节码,因为它是 JVM 字节码。

幸运的是this hero通过添加另一个动态 ClassLoader 解决了这个问题,它将动态类的字节转换为 DEX 文件,然后到 ODEX 以供 Android 运行时接受它(即使与 Instant Run 不一样,也非常相似在 Android Studio 上)。

不幸的是,那是在 2011 年和他的 Clojure fork已经四年没有维护了。

你可以看到 Clojure 的 Android 分支的作者在他精彩的 talk at ClojureConj 2011 中解释了它。 .

关于android - 在 Android : "can' t load this type of class file"上运行 Clojure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53070511/

相关文章:

java - PreferencesActivity 与 Fragment - 如何确定用户进入/离开

gradle - Gradle内置函数从何而来?

android - 更新到 Android Studio 2.2/gradle 插件 2.2.0 : "could not get unknown property ' assembleRelease'"后

android - 任务 ':app:transformClassesWithPreJackPackagedLibrariesForArmv7aDebug' 执行失败

clojure - 如何在 ClojureScript 中创建新图像

android - 从 Android 应用程序访问收件箱消息

android - 一个游戏的多个 apk 方法

android - Mockito:不调用传递给方法的 Runnable 参数的 Runnable.run()

unit-testing - Clojure 测试 : testing the negation of an assertion

namespaces - 无法让 pprint 在 clojure 中工作