8

我有一个简单的 android 应用程序,它在其构建路径上使用 modbus 库(“jamod”)。当我运行它时它立即崩溃。我在这个问题上有基本相同的问题:Getting "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

仔细检查您正在做的一件事是在“构建路径”窗口的“订购和导出”选项卡中勾选了 jar 文件的复选框。这将在构建的 APK 中包含该库。

于 2013-03-04T21:39:14.817 回答
4

你把jamod jar 文件放在Eclipse 的“libs”目录中了吗?如果不是,即使它在编译期间位于路径上,也不会捆绑到您的应用程序中。这是一个相当新的变化。

于 2012-08-09T15:42:54.547 回答
1

即使我的所有库都在“LIB”文件夹中并且也将它们添加到构建路径中,并且 ECLIPSE 可以在编译时轻松找到它们,但是当它们部署在一个真正的设备,它给了问题。解决方案:确保您的库文件放在 ECLIPSE 项目的“libs”文件夹中,而不是放在“lib”或“library”中。

于 2013-02-20T21:22:42.347 回答
0

当存在不兼容的资源(如接口/类/库文件)、不正确的继承/将静态/实例级别标识符封装为变量/方法/参数/类/文件时,会出现此错误 (java.lang.VerifyError)。

这个问题是由于违反了代码中的 OOP 设计原则而出现的。所以代码被jvm的验证过程拒绝并在运行时抛出验证错误。如果您仔细查看错误堆栈跟踪,则 jvm 堆栈 [java.lang.Class.newInstanceImpl(Native Method)... java.lang.Class 正在创建 class-A(com.example.xmlparsertest.MainActivity) 的实例。新实例...]。此类引用或被其他类引用违反了设计原则,导致该类无法实例化。

    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)

不能忽略这些警告,因为这些警告会导致 FATAL EXCEPTIONS。Dalvikvm Engineers 已经像 Sun Engineers Done 一样实施了 OOP 原则。有各种博客/论坛,人们说要忽略这些警告。因此,请不要忽略这些警告并更正它们,尤其是针对医疗/银行/安全领域应用程序或该警告导致应用程序中断。

请重新检查您在代码中实现的 OOP 设计原则(例如继承/封装/多态性等)。我被要求检查并消除大型多模块 android 应用程序上的此类错误,我发现许多设计违规。

解决此类问题的第一个触发器使与进入 FATAL ERROR 的类相关的所有内容都公开/非最终。一旦你解决了,然后一个接一个地实施你的设计原则,你将获得一个无错误的应用程序。

谢谢,Vinod Bherwal(Android 架构师)。

于 2016-12-04T12:20:17.467 回答