0

多くの場合、Android SDK に依存しない互換性のない jar ファイルを参照することを示唆する java.lang.VerifyError を読んだことがあります。

私の質問は、インポートされたjarファイル内で特にどのメソッド呼び出しが互換性がないかを確認する方法があるかどうかです。競合をリストすることは可能ですか?

このように、既製の Java プログラムを Android 互換にするのに多大な労力がかかっているかどうかを確認したいと思いますか?

これまでのところ、VerifyError とそれを引き起こしたファイルのみを取得しています。しかし、それは他のものを参照し、いくつかのコードを持つファイルであるため、正確にどの場所にエラーがあるかを知りたい.

編集

ここで、LogCat のログを確認できます。

09-21 11:10:03.080: W/dalvikvm(1988): VFY: unable to resolve exception class 427 (L/codec/ContentAccessException;)
09-21 11:10:03.080: W/dalvikvm(1988): VFY: unable to find exception handler at addr 0x16
09-21 11:10:03.080: W/dalvikvm(1988): VFY:  rejected Lsmb/LPP_SM;.start ()[Ljava/lang/String;
09-21 11:10:03.080: W/dalvikvm(1988): VFY:  rejecting opcode 0x0d at 0x0016
09-21 11:10:03.080: W/dalvikvm(1988): VFY:  rejected Lsmb/LPP_SM;.start ()[Ljava/lang/String;
09-21 11:10:03.080: W/dalvikvm(1988): Verifier rejected class Lsmb/LPP_SM;
09-21 11:10:03.080: D/AndroidRuntime(1988): Shutting down VM
09-21 11:10:03.080: W/dalvikvm(1988): threadid=1: thread exiting with uncaught exception (group=0x40a13300)
09-21 11:10:03.110: E/AndroidRuntime(1988): FATAL EXCEPTION: main
09-21 11:10:03.110: E/AndroidRuntime(1988): java.lang.VerifyError: smb/LPP_SM
09-21 11:10:03.110: E/AndroidRuntime(1988):     at com.example.androidtest.DisplayMessageActivity.onCreate(DisplayMessageActivity.java:109)
09-21 11:10:03.110: E/AndroidRuntime(1988):     at android.app.Activity.performCreate(Activity.java:5008)
09-21 11:10:03.110: E/AndroidRuntime(1988):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
09-21 11:10:03.110: E/AndroidRuntime(1988):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
09-21 11:10:03.110: E/AndroidRuntime(1988):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
09-21 11:10:03.110: E/AndroidRuntime(1988):     at android.app.ActivityThread.access$600(ActivityThread.java:130)
09-21 11:10:03.110: E/AndroidRuntime(1988):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
09-21 11:10:03.110: E/AndroidRuntime(1988):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-21 11:10:03.110: E/AndroidRuntime(1988):     at android.os.Looper.loop(Looper.java:137)
09-21 11:10:03.110: E/AndroidRuntime(1988):     at android.app.ActivityThread.main(ActivityThread.java:4745)
09-21 11:10:03.110: E/AndroidRuntime(1988):     at java.lang.reflect.Method.invokeNative(Native Method)
09-21 11:10:03.110: E/AndroidRuntime(1988):     at java.lang.reflect.Method.invoke(Method.java:511)
09-21 11:10:03.110: E/AndroidRuntime(1988):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
09-21 11:10:03.110: E/AndroidRuntime(1988):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
09-21 11:10:03.110: E/AndroidRuntime(1988):     at dalvik.system.NativeStart.main(Native Method)

問題のあるクラスまたは関数呼び出しのリストを求めました。ここでは、ContentAccessException が Android と互換性のない唯一の問題であることがわかると思います。

少なくとも、たとえば LPP_SM 内でその部分にコメントすると、エラーは消えます。しかし、この例外は、私が使用したライブラリの 1 つからのものであり、変更できません。

これ以上の衝突が起こる可能性はありますか?

4

2 に答える 2

0

デバッグ モードですか、それともリリースに proguard を使用していますか? java.lang.VerifyError は、Android クラス (View など) を使用する外部 jar があり、ターゲット sdk が jar の生成に使用されたものと異なる場合、コンパイラのバージョンが異なることが原因です。エラーのあるログにクラスが表示されます。完全なエラーを提供できますか? プロガードを使用している場合は、-dontpreverify -dontoptimizeoption を使用して事前検証を防ぐことができます。

于 2012-09-21T11:09:03.103 に答える
0

「adb logcat」の出力を注意深く読むことで、問題を追跡できるはずです。見つからなかったクラスと、不適切な参照を持つクラスを確認できるはずです。例外の直前に WARN/dalvikvm を検索します。

このスレッドには、さらにいくつかの情報があります: Android java.lang.VerifyError?

于 2012-09-21T11:21:24.170 に答える