【问题标题】:InvokeDynamic not supported when building for Android为 Android 构建时不支持 InvokeDynamic
【发布时间】:2016-10-17 06:43:44
【问题描述】:

我正在运行 Gluon/charm 版本 3.0.0。我在我的 JavaFX 项目(通过 IntelliJ 插件创建)中添加了一个 Java8 编译的库,在 iOS 上它可以按预期工作和构建,但是在执行 gradle 任务 androidandroidInstall 时,我得到了这个错误:

[ant:java] Java Result: 1
:createMainDexList FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':createMainDexList'.
> Exception in thread "main" com.android.dx.cf.iface.ParseException: InvokeDynamic not supported
    at com.android.dx.cf.cst.ConstantPoolParser.determineOffsets(ConstantPoolParser.java:226)
    at com.android.dx.cf.cst.ConstantPoolParser.parse(ConstantPoolParser.java:132)
    at com.android.dx.cf.cst.ConstantPoolParser.parseIfNecessary(ConstantPoolParser.java:124)
    at com.android.dx.cf.cst.ConstantPoolParser.getPool(ConstantPoolParser.java:115)
    at com.android.dx.cf.direct.DirectClassFile.parse0(DirectClassFile.java:491)
    at com.android.dx.cf.direct.DirectClassFile.parse(DirectClassFile.java:406)
    at com.android.dx.cf.direct.DirectClassFile.parseToEndIfNecessary(DirectClassFile.java:397)
    at com.android.dx.cf.direct.DirectClassFile.getAttributes(DirectClassFile.java:311)
    at com.android.multidex.MainDexListBuilder.hasRuntimeVisibleAnnotation(MainDexListBuilder.java:191)
    at com.android.multidex.MainDexListBuilder.keepAnnotated(MainDexListBuilder.java:167)
    at com.android.multidex.MainDexListBuilder.<init>(MainDexListBuilder.java:121)
    at com.android.multidex.MainDexListBuilder.main(MainDexListBuilder.java:91)
    at com.android.multidex.ClassReferenceListBuilder.main(ClassReferenceListBuilder.java:58)
...while preparsing cst 0002 at offset 0000000f
...while parsing de/<removed>/traffic_light/library/Test.class

我觉得有点奇怪的是,我什至没有用于 traffic_light 的测试类,甚至在库中也没有。搜索错误我发现它可能需要Java 8来调用Dynamic/Support Lambdas,但是例如Gluon的Presenter本身就使用了Lambdas。

另外,谷歌搜索我找到了this hit about the same issue,但遗憾的是 Gluon 删除了他们的论坛,并且页面没有缓存在任何地方。

【问题讨论】:

    标签: gluon gluon-mobile


    【解决方案1】:

    当您将一些第三方依赖项添加到使用 lambda 表达式的项目时,通常会发生此错误,因为目前 retrolambda 插件仅应用于您项目的源代码。

    你可以试试:

    1. 删除该依赖项并添加其源代码。

    2. 将 retrolambda 应用于原始依赖项,然后将其添加到您的项目中。

    3. 或者使用最新的 jfxmobile 插件:1.0.10-SNAPSHOT 将对源代码和第三方依赖项应用 retrolambda(即使没有提供源代码)。

    对于最后一个选项,只需更改 build.gradle 文件顶部的 jfxmobile 插件版本:

    buildscript {
        repositories {
            jcenter()
            maven {
                url "https://oss.sonatype.org/content/repositories/snapshots/"
            }
        }
        dependencies {
            classpath 'org.javafxports:jfxmobile-plugin:1.0.10-SNAPSHOT'
        }
    }
    

    【讨论】:

    • 从 Android Studio 3.0.0 开始,您可以安全地删除 RetroLambda,同时拥有完整的 Java8 支持 - 也适用于依赖项,因此应该不再出现此错误。
    猜你喜欢
    • 1970-01-01
    • 2018-10-10
    • 2020-08-30
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多