Lambda在Android库模块中导致编译器异常

时间:2016-05-25 23:28:33

标签: android lambda android-library android-studio-2.2 jack-compiler

当我在Android库模块中使用lambda表达式时,我收到编译器异常com.sun.tools.javac.code.Symbol$CompletionFailure: class file for java.lang.invoke.MethodType not found

在Android应用程序模块中使用时,Lambda表达式正在编译时没有错误。

可以在此处找到证明问题的示例项目:
https://github.com/adamdye/AndroidLambdaIssue

示例中有趣的类是MyLibrary.java和MainActivity.java。每个类包含相同的表达式。

设置

 Android Studio 2.2 preview 1
 min/target SDK version = android-N
 build tools version = 24.0.0.rc4
jack compiler enabled
source/target compatibility = 1.8
Gradle version = 2.10
Android Plugin Version = 2.2.0-alpha1
JDK = java 8 

我对使用retro-lambda不感兴趣。我希望通过正确的配置来实现这一点。我想我在某个地方错过了一步。

2 个答案:

答案 0 :(得分:7)

回过头来,加上我学到的东西。

我能够通过将JAVA HOME的运行时jar添加到项目的build.gradle文件中的gradle&bootclasspath来解决MethodType not found错误。

allprojects {    
    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs << "-Xbootclasspath/a:" + System.properties.get("java.home") + "/lib/rt.jar"
        }
    }
}

但是,应用程序不会部署到设备或模拟器,因为app:transformClassesWithPreJackPackagedLibrariesForDebug gradle任务失败。它要求所有用作lamba的接口都在类路径上。 bootclasspath修复程序没有设置Jack编译器的类路径,库也没有使用Jack编译器。

我在这个问题上打开了一个错误报告:https://code.google.com/p/android/issues/detail?id=211386

他们评论说,这将在不久的将来得到解决。

答案 1 :(得分:0)

我通过将包含Java源代码的JAR作为依赖项而不是编译的JAR来解决问题。这就是我配置项目的方式:

在图书馆的build.gradle

configurations {
    sources
}

task sourcesJar(type: Jar, dependsOn: classes) {
    classifier = 'sources'
    from sourceSets.main.java.srcDirs
}

artifacts {
    sources sourcesJar
}

在应用的build.gradle

dependencies {
    compile project(path: ":gdxstudio-core", configuration: "sources")

当然,该库作为外部项目包含在应用程序的settings.gradle