8

ビルドパスで modbus ライブラリ (「jamod」) を使用する単純な Android アプリケーションがあります。実行するとすぐにクラッシュします。この質問でも基本的に同じ問題があります。「Caused by: java.lang.VerifyError:」を取得する

しかし、私は本当に問題を解決することはできません。私のアプリケーションは以前は正常に動作していましたが、今は何をしても動作していないようです。

以下は logcat の出力です。前もって感謝します。

08-09 14:36:47.753: W/dalvikvm(396): VFY: unable to find class referenced in signature (Lnet/wimpi/modbus/net/TCPMasterConnection;)
08-09 14:36:47.823: W/dalvikvm(396): VFY: unable to resolve exception class 510 (Lnet/wimpi/modbus/ModbusIOException;)
08-09 14:36:47.823: W/dalvikvm(396): VFY: unable to find exception handler at addr 0x18
08-09 14:36:47.854: W/dalvikvm(396): VFY:  rejected Lcom/example/xmlparsertest/JavaModBusTcpDriver;.<init> (Ljava/lang/String;I)V
08-09 14:36:47.854: W/dalvikvm(396): VFY:  rejecting opcode 0x0d at 0x0018
08-09 14:36:47.854: W/dalvikvm(396): VFY:  rejected Lcom/example/xmlparsertest/JavaModBusTcpDriver;.<init> (Ljava/lang/String;I)V
08-09 14:36:47.854: W/dalvikvm(396): Verifier rejected class Lcom/example/xmlparsertest/JavaModBusTcpDriver;
08-09 14:36:47.854: D/AndroidRuntime(396): Shutting down VM
08-09 14:36:47.854: W/dalvikvm(396): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
08-09 14:36:47.873: E/AndroidRuntime(396): FATAL EXCEPTION: main
08-09 14:36:47.873: E/AndroidRuntime(396): java.lang.VerifyError: com.example.xmlparsertest.JavaModBusTcpDriver
08-09 14:36:47.873: E/AndroidRuntime(396):  at com.example.xmlparsertest.MainActivity.<init>(MainActivity.java:13)
08-09 14:36:47.873: E/AndroidRuntime(396):  at java.lang.Class.newInstanceImpl(Native Method)
08-09 14:36:47.873: E/AndroidRuntime(396):  at java.lang.Class.newInstance(Class.java:1429)
08-09 14:36:47.873: E/AndroidRuntime(396):  at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
08-09 14:36:47.873: E/AndroidRuntime(396):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577)
08-09 14:36:47.873: E/AndroidRuntime(396):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
08-09 14:36:47.873: E/AndroidRuntime(396):  at android.app.ActivityThread.access$2300(ActivityThread.java:125)
08-09 14:36:47.873: E/AndroidRuntime(396):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
08-09 14:36:47.873: E/AndroidRuntime(396):  at android.os.Handler.dispatchMessage(Handler.java:99)
08-09 14:36:47.873: E/AndroidRuntime(396):  at android.os.Looper.loop(Looper.java:123)
08-09 14:36:47.873: E/AndroidRuntime(396):  at android.app.ActivityThread.main(ActivityThread.java:4627)
08-09 14:36:47.873: E/AndroidRuntime(396):  at java.lang.reflect.Method.invokeNative(Native Method)
08-09 14:36:47.873: E/AndroidRuntime(396):  at java.lang.reflect.Method.invoke(Method.java:521)
08-09 14:36:47.873: E/AndroidRuntime(396):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
08-09 14:36:47.873: E/AndroidRuntime(396):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
08-09 14:36:47.873: E/AndroidRuntime(396):  at dalvik.system.NativeStart.main(Native Method)
4

4 に答える 4

15

実行していることを再確認する 1 つのことは、[ビルド パス] ウィンドウの [注文とエクスポート] タブで、jar ファイルのチェックボックスがオンになっていることです。これにより、ビルドされた APK にライブラリが含まれます。

于 2013-03-04T21:39:14.817 に答える
4

jamod jar ファイルを Eclipse の「libs」ディレクトリに配置しましたか? そうでない場合、コンパイル中にパス上にあったとしても、アプリケーションにバンドルされません。これはかなり新しい変更です。

于 2012-08-09T15:42:54.547 に答える
1

すべてのライブラリが「LIB」フォルダーにあり、ビルドパスにも追加されていて、コンパイル時にECLIPSEが簡単に見つけることができたにもかかわらず、同様のVFY、リンク、およびクラス定義が見つからないというエラーがありましたが、それらが展開されたとき実際のデバイスでは、問題が発生しました。解決策: ライブラリ ファイルが、ECLIPSE プロジェクトの「lib」や「library」ではなく、「libs」フォルダに配置されていることを確認してください。

于 2013-02-20T21:22:42.347 に答える
0

このエラー (java.lang.VerifyError) は、インターフェイス/クラス/ライブラリ ファイルなどの互換性のないリソース、変数/メソッド/引数/クラス/ファイルとしての静的/インスタンス レベル識別子の不適切な継承/カプセル化がある場合に発生します。

この問題は、コード内の OOP 設計原則に単に違反することによって発生します。そのため、コードは jvm の検証プロセスによって拒否され、実行時に検証エラーがスローされます。エラースタックトレースをよく見ると、class-A(com.example.xmlparsertest.MainActivity) のインスタンスが jvm スタック [java.lang.Class.newInstanceImpl(Native Method)... java.lang.Class.新しいインスタンス...]。このクラスは、設計原則に違反して他のクラスを参照しているか、参照されているため、クラスのインスタンス化に失敗しています。

    08-09 14:36:47.854: W/dalvikvm(396): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
    08-09 14:36:47.873: E/AndroidRuntime(396): FATAL EXCEPTION: main
    08-09 14:36:47.873: E/AndroidRuntime(396): java.lang.VerifyError: com.example.xmlparsertest.JavaModBusTcpDriver
    08-09 14:36:47.873: E/AndroidRuntime(396):  at com.example.xmlparsertest.MainActivity.<init>(MainActivity.java:13)
    08-09 14:36:47.873: E/AndroidRuntime(396):  at java.lang.Class.newInstanceImpl(Native Method)
    08-09 14:36:47.873: E/AndroidRuntime(396):  at java.lang.Class.newInstance(Class.java:1429)
    08-09 14:36:47.873: E/AndroidRuntime(396):  at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
    08-09 14:36:47.873: E/AndroidRuntime(396):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577)
    08-09 14:36:47.873: E/AndroidRuntime(396):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
    08-09 14:36:47.873: E/AndroidRuntime(396):  at android.app.ActivityThread.access$2300(ActivityThread.java:125)
    08-09 14:36:47.873: E/AndroidRuntime(396):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
    08-09 14:36:47.873: E/AndroidRuntime(396):  at android.os.Handler.dispatchMessage(Handler.java:99)
    08-09 14:36:47.873: E/AndroidRuntime(396):  at android.os.Looper.loop(Looper.java:123)
    08-09 14:36:47.873: E/AndroidRuntime(396):  at android.app.ActivityThread.main(ActivityThread.java:4627)
    08-09 14:36:47.873: E/AndroidRuntime(396):  at java.lang.reflect.Method.invokeNative(Native Method)
    08-09 14:36:47.873: E/AndroidRuntime(396):  at java.lang.reflect.Method.invoke(Method.java:521)
    08-09 14:36:47.873: E/AndroidRuntime(396):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
    08-09 14:36:47.873: E/AndroidRuntime(396):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
    08-09 14:36:47.873: E/AndroidRuntime(396):  at dalvik.system.NativeStart.main(Native Method)

これらの警告は致命的な例外を引き起こしているため、これらの警告を無視することはできません。Dalvikvm のエンジニアは、Sun のエンジニアが完了したように OOP の原則を実装しました。これらの警告を無視するように人々が言うさまざまなブログ/フォーラムがあります。したがって、これらの警告を無視せずに、特に医療/銀行/セキュリティ分野のアプリケーション、またはその警告が原因でアプリケーションが壊れる場合は修正してください。

コードに実装されている OOP 設計原則 (継承/カプセル化/ポリモーフィズムなど) を再確認してください。大規模なマルチモジュール Android アプリケーションでこのようなエラーをチェックして排除するように求められていたところ、多くの設計違反が見つかりました。

このような問題を解決するための最初のトリガーは、FATAL ERROR になっているクラスに関連するすべてを public/non-final にします。解決したら、設計原則を 1 つずつ実装すると、エラーのないアプリケーションが得られます。

ありがとう、Vinod Bherwal (Android アーキテクト)。

于 2016-12-04T12:20:17.467 に答える