VFY:无法找到签名中引用的类

时间:2012-08-09 14:57:51

标签: android jar

我有一个简单的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 个答案:

答案 0 :(得分:15)

要仔细检查你要做的一件事就是在Build path窗口的“Order and Export”选项卡中勾选jar文件的复选框。这将包括构建APK的库。

答案 1 :(得分:4)

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

答案 2 :(得分:1)

我有一个类似的VFY,链接和类def未找到错误,即使我的所有库都在“LIB”文件夹中并且已经在构建路径中添加它们,并且ECLIPSE可以在编译时轻松找到它们,但是当它们出现时部署在一个真实的设备上,它给了问题。 解决方案:确保您的库文件放在“libs”文件夹中,而不是放在ECLIPSE项目的“lib”或“library”中。

答案 3 :(得分:0)

当存在不兼容的资源(如interfaces / class / libs文件),不正确的继承/将静态/实例级别标识符封装为变量/ methods / arguments / class / files时,会出现此错误(java.lang.VerifyError)。

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

    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工程师已经实施了太阳工程师完成的OOP原则。有各种博客/论坛,人们说要忽略这些警告。因此,请不要忽略这些警告并更正它们,特别是对于医疗/银行/安全领域应用程序或警告导致破坏应用程序。

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

解决此类问题的第一个触发器使公共/非最终的所有与进入致命错误的类相关的一切。一旦你解决了,然后逐个实现你的设计原则,你就会得到一个无错误的应用程序。

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