繁体   English   中英

使用Java 8模块Gradle Android Project

[英]Gradle Android Project with Java 8 module

正如我在看到这个帖子Java 8不正式支持Android现在。 所以,我很感兴趣,如果有可能建立Android与模块Java 7Java模块(作为依赖)与Java 8

作为一个例子,我正在尝试创建一个Gradle项目,该项目将包含一个Android模块和一个Java模块作为依赖项。 通过为两个模块设置以下compileOptions ,一切正常。

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}

但是,如果我尝试将Java模块的compileOptions更改为

compileJava {
    sourceCompatibility = 1.8
    targetCompatibility = 1.8
}

我收到以下错误:

Error:Execution failed for task ':fc-android:preDexFreeDebug'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'C:\Program Files\Java\jdk1.8.0_45\bin\java.exe'' finished with non-zero exit value 1

那么问题是,实际上可能有用1.7版本编译的Android模块和用1.8编译的依赖Java模块吗? 如果没有,为什么呢?

更新:

Retrolamba for Gradle (由@Saeed提到)很好,但是它们只支持lambda,因此无法访问Stream APIDateTime API和其他功能。 想象一下,如果我们有使用Java 8构建的*.jar文件(没有Android代码)。 我认为我们不能使用这样的*.jar文件作为Android模块的依赖项,因为它的字节码不会被ARTDalvik支持,而只能由JVM for Java 8

从API 19开始,Android可以支持java 1.7(正如你在本文档中看到的那样,没有提到java 1.8),而且它不使用JVM并使用ART或Dalvik,所以它生成Dalvik字节码

我想如果我们想使用java 1.8作为compileOptions也许android运行时无法理解java 8中的一些新功能,比如lambda,所以gradle不允许你编译你的代码而你得到了那个例外。

所以你需要一个字节码转换器来使用

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }

阅读本教程 。它将您的字节码转换为与java 7兼容。我之前已经测试过,它对我有用。

2016年更新

Android N 引入了对Java 8语言功能的支持

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM