java.lang.NoClassDefFoundError: org.jgroups .- $$ Лямбда $ CbeKW6_ggTAEDuiYP5MNn0HcZP8 - PullRequest
0 голосов
/ 19 октября 2019

Мое приложение использует JGroups , версия 4.1.6. Финал. Моя активность вызывает JChannel():

class MainActivity : Activity() {
  override fun onCreate(savedInstanceState: Bundle?) {
      super.onCreate(savedInstanceState)
      JChannel()
  }
}

На платформе Android 8.0 звонок проходит. На платформе Android 6.0 я получаю эту ошибку:

10-18 14:11:43.148  4633  4633 E AndroidRuntime: FATAL EXCEPTION: main
10-18 14:11:43.148  4633  4633 E AndroidRuntime: Process: com.horph.jbomb, PID: 4633
10-18 14:11:43.148  4633  4633 E AndroidRuntime: java.lang.NoClassDefFoundError: org.jgroups.-$$Lambda$CbeKW6_ggTAEDuiYP5MNn0HcZP8
10-18 14:11:43.148  4633  4633 E AndroidRuntime:        at org.jgroups.JChannel.init(JChannel.java:950)
10-18 14:11:43.148  4633  4633 E AndroidRuntime:        at org.jgroups.JChannel.<init>(JChannel.java:125)
10-18 14:11:43.148  4633  4633 E AndroidRuntime:        at org.jgroups.JChannel.<init>(JChannel.java:107)
10-18 14:11:43.148  4633  4633 E AndroidRuntime:        at org.jgroups.JChannel.<init>(JChannel.java:98)
10-18 14:11:43.148  4633  4633 E AndroidRuntime:        at com.horph.jbomb.MainActivity.onCreate(MainActivity.kt:10)
10-18 14:11:43.148  4633  4633 E AndroidRuntime:        at android.app.Activity.performCreate(Activity.java:6237)

Тот же APK работает прекрасно на Android 8.0. С чем я мог столкнуться?

Рабочий пример: https://github.com/allenluce/jbomb

Ответы [ 2 ]

2 голосов
/ 19 октября 2019

Проблема в том, что JGroups полагается на ресурсы из версии Java 8, а некоторые из этих ресурсов доступны только для API 24 или выше (Android 7.0).

Line where problem occurs..

Метод forEach, вызванный вызовом конструктора по умолчанию JChannel, является одним из этих недоступных ресурсов в Android 6.0. Более простое решение - понизить версию JGroups и попробовать на устройствах Android 6, пока не заработает.

[Редактировать]: На основе другого ответа вы можете найти исходный код JGroup https://github.com/belaban/JGroups.

1 голос
/ 19 октября 2019

Новый ответ

Кажется, Android Studio 4.0 (в настоящее время на Канарских островах) будет поддерживать библиотеки десагеринга, поэтому стоит попробовать эту версию:

AndroidТеперь Studio включает поддержку использования ряда API-интерфейсов на языке Java 8, не требуя минимального уровня API для вашего приложения.

Благодаря процессу, называемому desugaring, компилятор DEX, D8, в Android Studio 3.0 и выше уже обеспечил существенную поддержкуподдержка функций языка Java 8 (таких как лямбда-выражения, методы интерфейса по умолчанию, попытка использования ресурсов и т. д.). В Android Studio 4.0 механизм десагеринга был расширен, чтобы можно было десагарировать API языка Java. Это означает, что теперь вы можете включать стандартные языковые API, которые были доступны только в последних выпусках Android (например, java.util.streams), в приложения, поддерживающие более старые версии Android.

В API поддерживается следующий набор APIэтот выпуск:

  • Последовательные потоки (java.util.stream)
  • Подмножество java.time
  • java.util.function
  • Недавние добавления к java.util. {Карта, Коллекция, Компаратор}
  • Необязательные (java.util.Optional, java.util.OptionalInt и java.util.OptionalDouble) и некоторые другие новые классы, полезные с помощью вышеуказанных API.
  • Некоторые дополнения к java.util.concurrent.atomic (новые методы для AtomicInteger, AtomicLong и AtomicReference)
  • ConcurrentHashMap (с исправлениями ошибок для Android 5.0)

Старый ответ

Android 6 не поддерживает лямбды Java 8. Вы можете использовать лямбда-выражения в Android Studio, но если ваша зависимость предварительно скомпилирована, кажется, что она все еще не работает на старых SDK. В вашем случае это происходит из-за ссылки на метод, использованной в JChannel.

. Есть по крайней мере два способа решения этой проблемы:

  • Выполните некоторое переплетение вашей зависимости от jar, чтобы перевестибайт-код для Java 6 и вручную добавьте .jar в папку /libs.
  • Загрузите исходный код JGroups в виде модуля библиотеки и скомпилируйте его в Android Studio. Вы также можете сделать его подмодулем git.

Я думал, что Proguard или R8 исправят это, но я попытался добавить их в пример проекта, которым вы поделились на github, безрезультатно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...