Java.lang.UnsatisfiedLinkError: не найдена реализация для java.lang.String при включенном proguard

Я получаю следующую ошибку, когда я включаю proguard.

java.lang.UnsatisfiedLinkError: No implementation found for java.lang.String com.osolutions.otv.utilities.al.b() (tried Java_com_osolutions_otv_utilities_al_b and Java_com_osolutions_otv_utilities_al_b__)
   at com.osolutions.otv.utilities.al.b(Native Method)
   at com.osolutions.otv.utilities.al.<clinit>(Unknown Source)
   at com.osolutions.otv.activity.SplashScreenActivity.a(Unknown Source)
   at com.osolutions.otv.activity.y.run(Unknown Source)
   at android.os.Handler.handleCallback(Handler.java:739)
   at android.os.Handler.dispatchMessage(Handler.java:95)
   at android.os.Looper.loop(Looper.java:148)
   at android.app.ActivityThread.main(ActivityThread.java:7331)
   at java.lang.reflect.Method.invoke(Native Method)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

Я также инициализировал класс Cpp, используя

static {
     System.loadLibrary("baseUrl");
}

Если я отключу proguard, он будет работать нормально. Это тот случай, когда proguard включен.

Предположительно настоящее название вашего метода было не "com.osolutions.otv.utilities.al.b"?

Botje 09.07.2019 10:35
Этот бит в руководстве ProGuard кажется актуальным.
Botje 09.07.2019 10:36

@Botje, потому что proguard включен

bhaskar 09.07.2019 10:42

Да, из вашего вопроса это было неясно. Вы пробовали мое предложение?

Botje 09.07.2019 10:53

@Botje, пожалуйста, посмотрите мой ответ, особенно последнее предложение :)

Xavier Rubio Jansana 09.07.2019 17:02

Эх, я предположил, что они попробовали то, что было в ссылке, и не смогли заставить это работать. Вы заслуживаете похвалы за то, что напечатали, что на самом деле сделало волшебное заклинание ProGuard.

Botje 09.07.2019 17:20
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
7
6
3 121
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как предполагает @Botje, проблема в вашем случае заключается в том, что собственное имя и определение вашего метода на стороне Java, так сказать, не синхронизируются.

ProGuard заменяет ваш public native String myMethod(); на public native String b();, но ваша собственная реализация сохраняет исходное имя. Вот почему среда выполнения Java не может его найти.

Вам необходимо добавить в файл ProGuard следующее:

-keepclasseswithmembernames,includedescriptorclasses class * {
    native <methods>;
}

Пожалуйста, НЕ отмечайте этот ответ как решение, так как с ним пришел @Botje (я только что немного развил объяснение).

@Botje, пожалуйста, добавьте свой ответ, чтобы он мог пометить его как решение.

Другие вопросы по теме