Android的Java 7语言功能
只是想知道是否有人尝试过在Android上使用新的Java7语言功能? 我知道Android读取Java吐出的字节码并将其转换为dex。所以我想我的问题是它能理解Java 7的字节码吗?编辑:在编写这篇文章时,最新版本是Android 9和Eclipse Indigo。从那时起,情况发生了变化Android的Java 7语言功能,java,android,bytecode,java-7,Java,Android,Bytecode,Java 7,只是想知道是否有人尝试过在Android上使用新的Java7语言功能? 我知道Android读取Java吐出的字节码并将其转换为dex。所以我想我的问题是它能理解Java 7的字节码吗?编辑:在编写这篇文章时,最新版本是Android 9和Eclipse Indigo。从那时起,情况发生了变化 实用答案 是的,我试过了。但这不是一个很好的测试,因为兼容性仅限于第6级,无法(至少没有简单的方法)真正使用java 7: 首先,我在一台没有安装其他JDK的机器上安装了JDK7—Eclipse和A
- 实用答案
- 首先,我在一台没有安装其他JDK的机器上安装了JDK7—Eclipse和Android也没有安装:
- 然后我安装了一个全新的EclipseIndigo,并检查它是否实际使用JDK7(好吧,因为这是唯一一个,而且这是我选择的一个,我会感到惊讶)
- 然后我安装了最新版本的Android SDK(编辑:蜂巢,API13,在撰写本文时)。它找到了我的JDK 7并正确安装。ADT也是如此
- 但当我试图编译并运行HelloWordAndroid应用程序时,我有一个惊喜。兼容性设置为Java 6,但无法强制将其设置为Java 7:
- 我尝试了一个非Android项目,一个普通的Java项目,我得到了解释。兼容性级别似乎受到Eclipse的限制(请参见下图底部的消息):
SQLite
、Listview
、Sensor
和Camera
,但这只能证明Java 7的兼容性处理似乎做得很好,并且可以与Android一起工作
那么,有人试着用这只善良的老蚂蚁来绕过上面提到的日食限制吗?
- 理论答案
对于那些参与webapps开发的人来说,这与在仅适用于java4的应用服务器下部署在java5或6下构建的web应用程序完全相同(比如weblogic8)。这可能有效,但除了尝试之外,这不是推荐的方法。引用dalvikvm.com: Android SDK中包含的dx将常规Java编译器编译的Java类的Java类文件转换为另一种类文件格式(即.dex格式) 这意味着,.java源文件并不重要,它只是.class字节码 据我所知,在Java7中,只有invokedynamic被添加到JVM字节码中,其余部分与Java6兼容。Java语言本身不使用invokedynamic。其他新特性,如使用字符串的switch语句或multi-catch语句,都是静态的,不需要更改字节码。例如,multi-catch只为每个可能的异常复制catch块 唯一的问题应该是Java 7中引入的新类在Android中缺失,比如AutoCloseable,所以我不确定您是否可以使用资源试用功能(有人试用过吗?)
对此有何评论?我遗漏了什么吗?自Android SDK v15以及Eclipse 3.7.1以来,Java 7在Android开发中不受支持。将源代码兼容性设置为1.7要求将生成的.class文件兼容性设置为1.7,这会导致Android编译器出现以下错误: Android要求编译器符合5.0或6.0级的要求。改为找到“1.7”。请使用Android工具>修复项目属性
如果您使用的是Android Studio,则应自动启用Java 7语言,无需任何补丁。Try with resource需要API级别19+,缺少NIO 2.0的内容 如果您不能使用Java7功能,请参阅的关于如何编辑
build.gradle
的答案
以下内容仅供历史参考
Java7的一小部分当然可以与Android一起使用(注意:我只在4.1上进行了测试) 首先,您不能使用Eclipse的ADT,因为只有Java编译器1.5和1.6是兼容的。你可以重新编译ADT,但我发现除了将整个Android重新编译在一起,没有简单的方法可以做到这一点 但是您不需要使用Eclipse。例如,和其他基于javac的IDE支持编译到Android,您可以使用以下工具将法规遵从性设置到Java 8:
- 文件→ 项目结构→ 模块→ (在第二个窗格中选择模块)→ 语言水平→ (选择“7.0-钻石、手臂、多钩等”)
- 菱形运算符(
) - 串开关
- 多个捕捉(
)catch(Exc1 | Exc2 e)
- 以数字字面值表示的下划线(
)1\u 234\u 567
- 二进制文字(
)0b1110111
-with resources语句-因为它需要不存在的try
android { compileSdkVersion 19 buildToolsVersion '19.0.3' defaultConfig { minSdkVersion 15 targetSdkVersion 19 } compileOptions { sourceCompatibility JavaVersion.VERSION_1_7 targetCompatibility JavaVersion.VERSION_1_7 } }
<issue id="NewApi"> <ignore regexp="Try-with-resources requires API level 19"/> </issue>
<project name="custom_android_rules"> <property name="java.target" value="1.7" /> <property name="java.source" value="1.7" /> </project>