87 votes

Méthode non trouvée en utilisant DigestUtils dans Android

Je suis en train d'utiliser la bibliothèque DigestUtils dans Android 2.3.1 l'aide de JDK 1.6, mais j'ai l'erreur suivante lors de l'exécution de l'application:

Could not find method org.apache.commons.codec.binary.Hex.encodeHexString, referenced from method org.apache.commons.codec.digest.DigestUtils.shaHex

Ici vous avez la stacktrace:

02-03 10:25:45.153: I/dalvikvm(1230): Could not find method org.apache.commons.codec.binary.Hex.encodeHexString, referenced from method org.apache.commons.codec.digest.DigestUtils.shaHex
02-03 10:25:45.153: W/dalvikvm(1230): VFY: unable to resolve static method 329: Lorg/apache/commons/codec/binary/Hex;.encodeHexString ([B)Ljava/lang/String;
02-03 10:25:45.153: D/dalvikvm(1230): VFY: replacing opcode 0x71 at 0x0004
02-03 10:25:45.153: D/dalvikvm(1230): VFY: dead code 0x0007-0008 in Lorg/apache/commons/codec/digest/DigestUtils;.shaHex ([B)Ljava/lang/String;
02-03 10:25:45.163: D/AndroidRuntime(1230): Shutting down VM
02-03 10:25:45.163: W/dalvikvm(1230): threadid=1: thread exiting with uncaught exception (group=0x40015560)
02-03 10:25:45.173: E/AndroidRuntime(1230): FATAL EXCEPTION: main
02-03 10:25:45.173: E/AndroidRuntime(1230): java.lang.NoSuchMethodError: org.apache.commons.codec.binary.Hex.encodeHexString
02-03 10:25:45.173: E/AndroidRuntime(1230):     at org.apache.commons.codec.digest.DigestUtils.md5Hex(DigestUtils.java:226)
02-03 10:25:45.173: E/AndroidRuntime(1230):     at com.caumons.trainingdininghall.ConnectionProfileActivity.onCreate(ConnectionProfileActivity.java:20)
02-03 10:25:45.173: E/AndroidRuntime(1230):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
02-03 10:25:45.173: E/AndroidRuntime(1230):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1586)
02-03 10:25:45.173: E/AndroidRuntime(1230):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1638)
02-03 10:25:45.173: E/AndroidRuntime(1230):     at android.app.ActivityThread.access$1500(ActivityThread.java:117)
02-03 10:25:45.173: E/AndroidRuntime(1230):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:928)
02-03 10:25:45.173: E/AndroidRuntime(1230):     at android.os.Handler.dispatchMessage(Handler.java:99)
02-03 10:25:45.173: E/AndroidRuntime(1230):     at android.os.Looper.loop(Looper.java:123)
02-03 10:25:45.173: E/AndroidRuntime(1230):     at android.app.ActivityThread.main(ActivityThread.java:3647)
02-03 10:25:45.173: E/AndroidRuntime(1230):     at java.lang.reflect.Method.invokeNative(Native Method)
02-03 10:25:45.173: E/AndroidRuntime(1230):     at java.lang.reflect.Method.invoke(Method.java:507)
02-03 10:25:45.173: E/AndroidRuntime(1230):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
02-03 10:25:45.173: E/AndroidRuntime(1230):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
02-03 10:25:45.173: E/AndroidRuntime(1230):     at dalvik.system.NativeStart.main(Native Method)

La ligne de code qui provoque l'exception est la suivante:

String hash = DigestUtils.shaHex("textToHash");

J'ai exécuté le même code dans une classe Java à l'extérieur Android et ça fonctionne! Donc, je ne sais pas pourquoi lorsque l'on travaille avec Android, il ne fonctionne pas... j'ai mis le libraty à l'intérieur d'un nouveau libs/ dossier dans mon application et mise à jour le BuildPath de l'utiliser. Si j'essaie d'utiliser md5 au lieu de sha1-je obtenir la même exception. Toute aide serait appréciée! Je vous remercie.

Mise à JOUR:

Comme c'est un domaine très actif en question, j'ai changé la accepté de répondre en faveur de @DA25, sa solution est simple, et le nombre élevé de upvotes prouver que cela fonctionne.

156voto

DA25 Points 656

J'ai rencontré le même problème en essayant d'utiliser DigestUtils dans mon application Android. C'était la meilleure réponse que j'ai pu trouver par la recherche, mais j'étais réticent à reconstruire le .fichier jar avec l'espace de noms changé. Après avoir passé quelque temps sur cette question, j'ai trouvé un moyen plus facile de résoudre le problème pour mon cas. L'énoncé du problème pour mon code a été

String s = DigestUtils.md5Hex(data);

Remplacer cette déclaration par la suite et il va fonctionner:

String s = new String(Hex.encodeHex(DigestUtils.md5(data)));

De même, pour shaHex exampl, vous pouvez la changer

String hash = new String(Hex.encodeHex(DigestUtils.sha("textToHash");

Cela fonctionne parce que même si Android n'a pas encodeHexString(), il ne l'ont encodeHex(). Espérons que cela aidera d'autres personnes qui rencontrent le même problème.

20voto

Caumons Points 1702

Enfin, je reçois la réponse et il fonctionne bien. Comme le décrit Pas une telle erreur de méthode dans Apache codec pour un autre type de chiffrer (Base64) j'ai essayé de reproduire le même problème et j'ai exactement la même erreur. J'ai donc été dans le cas de la question ci-joint. Comme ils le disent, il semble être un nom interne de la collision avec le nom du package org.apache.commons.codec et, comme indiqué par @Don je l'ai changé pour com.apache.commons.codec et a bien fonctionné! Comment j'ai fait?

J'ai téléchargé le code source et changé les 3 répertoires org de com. J'ai aussi remplacé toutes les occurrences du nom du paquet dans les fichiers où qu'ils apparaissent et aussi changé les références dans les docs de com/apache/commons/codec/. (N'essayez pas de remane manuellement ou vous passerez le trou de la journée). Ensuite, j'ai compilé la bibliothèque et a généré le pot avec de l'Ant, que j'ai appelée" commons-codec-1.6-android.jar. J'ai mis le pot dans l' libs/ le dossier de mon application Android et de l'ajouter à la buildpath. Aussi, j'ai attaché les sources comme le dossier qui contient tous les fichiers. Alors maintenant, j'ai de la bibliothèque de prêt à l'utilisation avec Android!

Espérons que cela aide quelqu'un d'autre!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X