加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

使用Java 8模块Gradle Android Project

发布时间:2020-12-14 06:03:18 所属栏目:Java 来源:网络整理
导读:正如我在 this post中看到的那样,Java 8现在还没有得到Android的正式支持.所以我很感兴趣是否可以使用Java 8构建带有Java 7和Java模块(作为依赖项)的Android模块. 作为一个例子,我正在尝试创建一个Gradle项目,该项目将包含一个Android模块和一个Java模块作为
正如我在 this post中看到的那样,Java 8现在还没有得到Android的正式支持.所以我很感兴趣是否可以使用Java 8构建带有Java 7和Java模块(作为依赖项)的Android模块.

作为一个例子,我正在尝试创建一个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 FilesJavajdk1.8.0_45binjava.exe'' finished with non-zero exit value 1

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

更新:

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

解决方法

从API 19开始,Android可以支持java 1.7(正如你在 doc中看到的那样,没有提到java 1.8),它也没有使用JVM,而是使用ART或Dalvik,因此它生成了 Dalvik bytecode.

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

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

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }

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

2016年更新

Android N introduces support for Java 8 language features.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读