Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android的Java 7语言功能_Java_Android_Bytecode_Java 7 - Fatal编程技术网

Android的Java 7语言功能

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

只是想知道是否有人尝试过在Android上使用新的Java7语言功能? 我知道Android读取Java吐出的字节码并将其转换为dex。所以我想我的问题是它能理解Java 7的字节码吗?

编辑:在编写这篇文章时,最新版本是Android 9和Eclipse Indigo。从那时起,情况发生了变化

  • 实用答案
是的,我试过了。但这不是一个很好的测试,因为兼容性仅限于第6级,无法(至少没有简单的方法)真正使用java 7:

  • 首先,我在一台没有安装其他JDK的机器上安装了JDK7—Eclipse和Android也没有安装:

  • 然后我安装了一个全新的EclipseIndigo,并检查它是否实际使用JDK7(好吧,因为这是唯一一个,而且这是我选择的一个,我会感到惊讶)

  • 然后我安装了最新版本的Android SDK(编辑:蜂巢,API13,在撰写本文时)。它找到了我的JDK 7并正确安装。ADT也是如此

  • 但当我试图编译并运行HelloWordAndroid应用程序时,我有一个惊喜。兼容性设置为Java 6,但无法强制将其设置为Java 7:

  • 我尝试了一个非Android项目,一个普通的Java项目,我得到了解释。兼容性级别似乎受到Eclipse的限制(请参见下图底部的消息):

因此,我让Hello World和其他应用程序工作,更复杂,并且使用
SQLite
Listview
Sensor
Camera
,但这只能证明Java 7的兼容性处理似乎做得很好,并且可以与Android一起工作

那么,有人试着用这只善良的老蚂蚁来绕过上面提到的日食限制吗?

  • 理论答案
无论如何,正如前面所解释的,SDK设计用于Java5或Java6

我们可能有一些东西与Java7一起工作,但这是“偶然的”。DEX的构建可能正常工作,也可能无法正常工作,而一旦DEX构建,它可能正常工作,也可能无法正常工作。这是因为根据定义,使用非限定JDK会产生不可预测的结果

即使有人成功地在纯Java 7下构建了Android应用程序,这也不符合JDK的要求。应用于另一个应用程序的同一进程可能会失败,或者生成的应用程序可能存在与该JDK的使用相关的bug。不推荐


对于那些参与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-钻石、手臂、多钩等”)

这只允许使用Java 7语言功能,您几乎无法从中受益,因为库也带来了一半的改进。您可以使用不依赖于库的功能:

  • 菱形运算符(
  • 串开关
  • 多个捕捉(
    catch(Exc1 | Exc2 e)
  • 以数字字面值表示的下划线(
    1\u 234\u 567
  • 二进制文字(
    0b1110111
这些功能目前还不能使用:

  • try
    -with resources语句-因为它需要不存在的
    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>