Приложение Android Telegram -> java.lang.UnsatisfiedLinkError: Реализация не найдена для void
К сожалению, аналогичный вопрос был удален в Stackru несколько недель назад, я должен задать новый вопрос.
Я пытаюсь создать собственное приложение Telegram для Android через источник @ https://github.com/DrKLO/Telegram
Я не могу заставить его работать, он останавливается при запуске со следующей ошибкой, любые идеи о том, с чего начать, я совершенно новичок в 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)
5 ответов
Основная проблема заключается в том, что вы запускаете проект без генерации нативной библиотеки из кодов C/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
Windows
- Скачать 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
расширение. Наконец, запустите проект.
Как сказал Хесус Кастро, вы должны компилировать нативный код в библиотеки с .so
Суффикс, что Android может использовать их для запуска приложения.
Но почему это произошло недавно? Потому что в последнем коммите репозитория Telegram DrKLO они удалили предварительно собранные библиотеки в соответствии с сообщением коммита в git:
Удаление готовых библиотек. Исходный код для всех библиотек (и всегда был) доступен здесь: https://github.com/DrKLO/Telegram/tree/master/TMessagesProj/jni
Вы можете найти коммит здесь.
Итак, чтобы решить вашу проблему, вы можете удалить ваши 64-битные библиотеки из вашей сборки или настроить abiFilters для упаковки только 32-битных архитектур:
android {
....
defaultConfig {
....
ndk {
abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
}
}
}
добавьте android.useDeprecatedNdk=true в файл с именем gradle.properties в корне вашего проекта
У меня было похожее сообщение об ошибке. Решение для меня состояло в том, чтобы удалить приложение из симулятора, очистить проект (включая все библиотеки) и выполнить перестройку. Теперь приложение запускается нормально.
@Rajsundar . При добавлении строки:
export ndkbuild=/cygdrive/c/android-ndk-r10e/ndk-build.cmd
не работает. После всего остального вы можете просто запустить команду прямо из каталога jni.
/cygdrive/c/android-ndk-r10e/ndk-build.cmd