Подтвердить что ты не робот

Android Telegram App → java.lang.UnsatisfiedLinkError: не реализована реализация для void

К несчастью, аналогичный вопрос был удален в Stackoverflow несколько недель назад, я должен задать новый вопрос.

Я пытаюсь создать собственное приложение Telegram для android через источник @https://github.com/DrKLO/Telegram

Я не могу заставить его работать, он останавливается при запуске со следующей ошибкой, любыми идеями о том, с чего начать, Im совершенно новый для Android Studio.

11-17 19:55:04.142 2667-2667/org.telegram.messenger E/art: No implementation found for void org.telegram.tgnet.ConnectionsManager.native_setJava(boolean) (tried Java_org_telegram_tgnet_ConnectionsManager_native_1setJava and Java_org_telegram_tgnet_ConnectionsManager_native_1setJava__Z)
11-17 19:55:04.142 2667-2667/org.telegram.messenger D/AndroidRuntime: Shutting down VM
11-17 19:55:04.151 2667-2667/org.telegram.messenger E/AndroidRuntime: FATAL EXCEPTION: main
11-17 19:55:04.151 2667-2667/org.telegram.messenger E/AndroidRuntime: Process: org.telegram.messenger, PID: 2667
11-17 19:55:04.151 2667-2667/org.telegram.messenger E/AndroidRuntime: java.lang.UnsatisfiedLinkError: No implementation found for void org.telegram.tgnet.ConnectionsManager.native_setJava(boolean) (tried Java_org_telegram_tgnet_ConnectionsManager_native_1setJava and Java_org_telegram_tgnet_ConnectionsManager_native_1setJava__Z)
11-17 19:55:04.151 2667-2667/org.telegram.messenger E/AndroidRuntime:     at org.telegram.tgnet.ConnectionsManager.native_setJava(Native Method)
11-17 19:55:04.151 2667-2667/org.telegram.messenger E/AndroidRuntime:     at org.telegram.messenger.ApplicationLoader.onCreate(ApplicationLoader.java:259)
11-17 19:55:04.151 2667-2667/org.telegram.messenger E/AndroidRuntime:     at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1013)
11-17 19:55:04.151 2667-2667/org.telegram.messenger E/AndroidRuntime:     at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4707)
11-17 19:55:04.151 2667-2667/org.telegram.messenger E/AndroidRuntime:     at android.app.ActivityThread.-wrap1(ActivityThread.java)
11-17 19:55:04.151 2667-2667/org.telegram.messenger E/AndroidRuntime:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1405)
11-17 19:55:04.151 2667-2667/org.telegram.messenger E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:102)
11-17 19:55:04.151 2667-2667/org.telegram.messenger E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:148)
11-17 19:55:04.151 2667-2667/org.telegram.messenger E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5417)
11-17 19:55:04.151 2667-2667/org.telegram.messenger E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
11-17 19:55:04.151 2667-2667/org.telegram.messenger E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
11-17 19:55:04.151 2667-2667/org.telegram.messenger E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
4b9b3361

Ответ 1

Основная проблема заключается в том, что вы запускаете проект без создания собственной библиотеки из кодов C/С++. Из-за этого проекта, основанного на Telegram, который вы указываете на ссылку, есть файл Android.mk в каталоге jni, вам нужно скомпилировать код вручную. Я исправил это исключение, выполнив следующие шаги:

  • Убедитесь, что build.gradle содержит:

исходная версия 3.13.1 и новее:

sourceSets.main.jniLibs.srcDirs = ['./jni/']

исходная версия ниже 3.13.1:

    sourceSets.main {
       jniLibs.srcDirs = 'libs'
       jni.srcDirs = [] //disable automatic ndk-build call
    }
  • Загрузите NDK

Действуйте в соответствии с вашей операционной системой.

Linux/Mac

$ cd <path-to-Telegram>/TMessagesProj
$ <path-to-ndk>/ndk-build

Окна

  • Загрузить Cygwin
  • Добавить файл .bashrc, который помещается в корневой каталог Cygwin (используйте некоторую утилиту для поиска этого файла). В моем случае файл был помещен в C:\cygwin64\home\myuser.

    export ndkbuild=/cygdrive/partition_name/your_ndk_directory/ndk-build.cmd
    
  • Откройте терминал Cygwin и перейдите в каталог jni проекта:

    cd /cygdrive/your_partition_name/project_jni_directory_path
    
  • Напишите $ndkbuild и дождитесь завершения компилятором своей задачи. Если этот процесс прав, появятся две директории, obj и libs. Убедитесь, что каталог libs содержит некоторую библиотеку с расширением .so. Наконец, запустите проект.

Ответ 2

Как отметил Jesús Castro, вы должны скомпилировать собственные коды в библиотеках с суффиксом .so, который может использовать Android для запуска приложения.

Но почему это произошло недавно? Поскольку в последнем компете репозитория DrKLO Telegram они удалили предварительно созданные библиотеки в соответствии с сообщением commit в git:

Удаление предварительно построенных библиотек. Исходный код для всех библиотек доступен (и всегда был): https://github.com/DrKLO/Telegram/tree/master/TMessagesProj/jni

Вы можете найти фиксацию здесь.

Ответ 3

Итак, чтобы решить вашу проблему, вы можете удалить свои 64-битные библиотеки из своей сборки или установить abiFilters для упаковки только 32-разрядных архитектур:

android {
....
defaultConfig {
    ....
    ndk {
        abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
    }
}

}

добавить android.useDeprecatedNdk = true в файл с именем gradle.properties в корневом каталоге вашего проекта

Ответ 4

@Rajsundar. Если добавить строку:

export ndkbuild=/cygdrive/c/android-ndk-r10e/ndk-build.cmd

не работает. После выполнения всего остального вы можете просто запустить команду непосредственно из каталога jni.

/cygdrive/c/android-ndk-r10e/ndk-build.cmd

Ответ 5

У меня было подобное сообщение об ошибке. Решение для меня состояло в том, чтобы удалить приложение из симулятора, очистить проект (включая все библиотеки) и выполнить перестройку. Теперь приложение начинает нормально.