web-dev-qa-db-fra.com

Android Telegram App -> Java.lang.UnsatisfiedLinkError: Aucune implémentation trouvée pour void

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)
23
stavasknall

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:

  • Regarde ça 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.

Linux/Mac

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

Les fenêtres

  • Télécharger Cygwin
  • 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.

21
Jesús Castro

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 .

5
Navid Eivazzadeh

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

1
FeelCode

@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
0
Ishmael Chibvuri

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.

0
testing