Malheureusement, une question similaire a été supprimée chez Stackoverflow il y a quelques semaines, je dois poser une nouvelle question.
Im essayant de créer une propre application Telegram pour Android via la source @ https://github.com/DrKLO/Telegram
Je ne peux pas le faire fonctionner, il s'arrête au démarrage avec l'erreur suivante, des idées sur où commencer, je suis assez nouveau pour 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)
Le problème principal est que vous exécutez le projet sans générer la bibliothèque native à partir des codes C/C++. En raison de ce projet basé sur Telegram, que vous signalez avec le lien, le fichier Android.mk
sur le répertoire jni
, vous devez compiler le code manuellement. J'ai corrigé cette exception en suivant ces étapes:
build.gradle
contient:version source 3.13.1 et plus récente:
sourceSets.main.jniLibs.srcDirs = ['./jni/']
version source inférieure à 3.13.1:
sourceSets.main { jniLibs.srcDirs = 'libs' jni.srcDirs = [] //disable automatic ndk-build call }
Procédez selon votre système d'exploitation.
$ cd <path-to-Telegram>/TMessagesProj
$ <path-to-ndk>/ndk-build
Ajouter .bashrc
fichier, qui est placé dans le répertoire racine de Cygwin (utilisez un utilitaire pour trouver ce fichier). Dans mon cas, le fichier a été placé dans C:\cygwin64\home\myuser
.
export ndkbuild=/cygdrive/partition_name/your_ndk_directory/ndk-build.cmd
Ouvrez le terminal Cygwin et déplacez-vous vers le répertoire jni
du projet:
cd /cygdrive/your_partition_name/project_jni_directory_path
Écrire $ndkbuild
et attendez que le compilateur termine sa tâche. Si ce processus est correct, deux répertoires s'affichent, obj
et libs
. Vérifiez que le répertoire libs
contient une bibliothèque avec .so
extension. Enfin, exécutez le projet.
Comme l'a mentionné Jesús Castro, vous devez compiler des codes natifs dans des bibliothèques avec .so
suffixe qui Android peut les utiliser pour exécuter l'application.
Mais pourquoi cela s'est-il produit récemment? Parce que dans la dernière validation du référentiel Telegram de DrKLO, ils ont supprimé les bibliothèques prédéfinies en fonction du message de validation dans git:
Suppression des bibliothèques prédéfinies. Le code source de toutes les bibliothèques est (et a toujours été) disponible ici: https://github.com/DrKLO/Telegram/tree/master/TMessagesProj/jni
Vous pouvez trouver le commit ici .
Donc, pour résoudre votre problème, vous pouvez supprimer vos bibliothèques 64 bits de votre build, ou définir abiFilters pour empaqueter uniquement des architectures 32 bits:
Android {
....
defaultConfig {
....
ndk {
abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
}
}
}
ajoutez Android.useDeprecatedNdk = true à un fichier nommé gradle.properties à la racine de votre projet
@Rajsundar. Si vous ajoutez la ligne:
export ndkbuild=/cygdrive/c/Android-ndk-r10e/ndk-build.cmd
ne fonctionne pas. Après avoir fait tout le reste, vous pouvez simplement exécuter la commande directement à partir du répertoire jni.
/cygdrive/c/Android-ndk-r10e/ndk-build.cmd
J'ai eu un message d'erreur similaire. La solution pour moi était de désinstaller l'application du simulateur, de nettoyer le projet (y compris toutes les bibliothèques) et de faire une reconstruction. Maintenant, l'application démarre bien.