0

new特定のクラスにしようとすると NoSuchMethodError をスローするアプリに取り組んでいます。コードは次のようになります...

Bar bar = new Bar(Bar.Type.WHATEVER, 1f);

...そしてエラーは...

Caused by: java.lang.NoSuchMethodError: com.foo.Bar.<init>

私がオンラインで見たものはすべて、ライブラリのあるバージョンに対してコンパイルし、同じメソッド/シグネチャを持たない別のバージョンで実行することに関連しています。ただし、私の場合、問題のクラスは JAR にあり、そのクラスはアプリの APK にエクスポートされています。実行時に別のバージョンのクラスを使用するべきではありませんよね?

のコンストラクター引数がBar最近変更されたため、次の手順を実行して、変更が APK に反映されたことを確認しました。

  1. APKを開いてclasses.dexを抽出しました
  2. dex2jar を使用して DEX を JAR に変換しました
  3. JAR を開き、問題のクラスを抽出しました。
  4. jclasslib を使用してクラスを検査し、コンストラクターが存在することを確認しました。そうですか<init>(Lcom/foo/Bar$Type;F)

この時点で、私は困惑しています。このエラーの原因は誰にも分かりますか?

4

1 に答える 1

0

アプリが再び動作するようになりました。問題は、プロジェクトが使用する jar であり、Bar の (現在は古い) バージョンを使用してビルドされたものだと思います。私のアプリが jar X (Bar を含む) と Y (Bar を使用する) に依存しているとします。Bar の署名が最近変更されたことを知っていたので、その変更が APK に反映されていることがわかりました。しかし、私が気付いていなかったのは、jar Y が Bar を使用しており、最近再構築されていないことでした。スローされる例外はメソッド名<init>(コンストラクター) のみを言及し、パラメーターは言及していないため、Bar が (現在は存在しない) デフォルトのコンストラクターを使用して構築されようとしていることに気付きませんでした。

于 2013-02-07T20:16:14.143 に答える