Просто интересно, пытался ли кто-нибудь использовать новые функции языка Java 7 с Android? Я знаю, что Android читает байт-код, который выплевывает Java, и превращает его в dex. Итак, я думаю, мой вопрос, может ли он понять байт-код Java 7?
Просто интересно, пытался ли кто-нибудь использовать новые функции языка Java 7 с Android? Я знаю, что Android читает байт-код, который выплевывает Java, и превращает его в dex. Итак, я думаю, мой вопрос, может ли он понять байт-код Java 7?
Ответы:
Если вы используете Android Studio , то Java 7 язык должен быть включен автоматически , без каких - либо исправлений. Try-with-resource требует API уровня 19+, а NIO 2.0 не хватает.
Если вы не можете использовать функции Java 7, см. Ответ @Nuno о том, как отредактировать свой build.gradle
.
Следующее только для исторического интереса.
Небольшая часть Java 7, безусловно, может использоваться с Android (примечание: я тестировал только на 4.1).
Прежде всего, вы не могли использовать ADT Eclipse, потому что он жестко запрограммирован на совместимость только с Java-компиляторами 1.5 и 1.6. Вы можете перекомпилировать ADT, но я считаю, что нет простого способа сделать это, кроме перекомпиляции всего Android вместе.
Но вам не нужно использовать Eclipse. Например, Android Studio 0.3.2 , IntelliJ IDEA CE и другие IDE на основе javac поддерживают компиляцию под Android, и вы можете установить соответствие даже до Java 8 с помощью:
Это позволяет использовать только функции языка Java 7 , и вы вряд ли сможете извлечь выгоду из чего-либо, поскольку половина улучшений также обеспечивается библиотекой. Возможности, которые вы можете использовать, это те, которые не зависят от библиотеки:
<>
)catch (Exc1 | Exc2 e)
)1_234_567
)0b1110111
)И эти функции не могут быть использованы еще :
try
-with-resources - потому что он требует несуществующего интерфейса "java.lang.AutoCloseable" (это можно использовать публично в 4.4+)... "пока" :) Оказывается, что, хотя библиотека Android ориентирована на 1.6, источник Android содержит интерфейсы, такие как AutoCloseable, и традиционные интерфейсы, такие как Closeable , наследуют от AutoCloseable (хотя SafeVarargs действительно отсутствует). Мы могли бы подтвердить его существование через отражение. Они скрыты просто потому, что в Javadoc есть @hide
тег, из-за которого «android.jar» не включает их.
Уже существует уже существующий вопрос Как мне собрать Android SDK со скрытыми и доступными внутренними API? о том, как вернуть эти методы. Вам просто нужно заменить существующую ссылку «android.jar» текущей Платформы на нашу настроенную, после чего станут доступны многие API Java 7 (процедура аналогична той, что в Eclipse. Проверьте Структуру проекта → SDK.)
В дополнение к AutoCloseable, (только) также раскрываются следующие функции библиотеки Java 7 :
Это в основном все. В частности, NIO 2.0 не существует, а Arrays.asList все еще не является @SafeVarargs.
nio2
и другие плюсы определенно будут хорошей новостью.
AutoCloseable
интерфейс не существует во время выполнения Android до ICS (или, возможно, до HoneyComb). Так что даже если вы используете исправленный android.jar, вы получите NoClassDefFoundError
систему 2.x.
invokedynamic
которая не поддерживается JVM, ориентированной на Java 6.