1. ホーム
  2. android

[解決済み] AndroidでDigestUtilsを使用してもメソッドが見つからない

2023-06-02 10:08:58

質問

私は、ライブラリ ダイジェストユーティリティ を Android 2.3.1 で JDK 1.6 を使用して使用しようとしていますが、アプリを実行すると次のエラーが発生します。

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: 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)

例外を発生させるコードの行は

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

同じコードをAndroid以外のJavaクラスで実行したところ、うまくいきました。したがって、Android で作業しているときになぜ動作しないのかわかりません... アプリ内の新しい libs/ フォルダにライブラリを配置し、それを使用するように BuildPath を更新しました。sha1の代わりにmd5を使用しようとすると、同じ例外が発生します。どんなヘルプでも結構です。ありがとうございます。

UPDATEです。

これは非常に活発な質問なので、私は @DA25 の解決策が簡単であり、多くのアップヴォートがそれが機能することを証明するため、受け入れた回答を変更しました。

どのように解決するのですか?

Android アプリで DigestUtils を使用しようとして、同じ問題に遭遇しました。これは、私が検索して見つけた最高の答えでしたが、名前空間を変更して .jar ファイルを再構築することに抵抗がありました。この問題に時間を費やした後、私の場合、より簡単に問題を解決する方法を見つけました。私のコードに対する問題文は

String s = DigestUtils.md5Hex(data);

この文を以下のように置き換えると、動作します。

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

同様に、shaHexのexampleについても、以下のように変更することができます。

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

AndroidにはencodeHexString()はありませんが、encodeHex()はあるので、これは動作します。これが同じ問題に遭遇した他の人の助けになることを願っています。