更新 SDK 后出现了 "NoClassDefFoundError for zxing" 的错误

20

如何解决 NoClassDefFoundError 错误。 我在我的应用程序中集成了 Zxing,一切都运行良好。然后我更新了 SDK 和 Eclipse 插件,运行该项目时日志显示

03-27 17:27:45.173: E/AndroidRuntime(8917): FATAL EXCEPTION: main
03-27 17:27:45.173: E/AndroidRuntime(8917): java.lang.ExceptionInInitializerError
03-27 17:27:45.173: E/AndroidRuntime(8917):     at java.lang.Class.newInstanceImpl(Native Method)
03-27 17:27:45.173: E/AndroidRuntime(8917):     at java.lang.Class.newInstance(Class.java:1429)
03-27 17:27:45.173: E/AndroidRuntime(8917):     at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
03-27 17:27:45.173: E/AndroidRuntime(8917):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577)
03-27 17:27:45.173: E/AndroidRuntime(8917):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
03-27 17:27:45.173: E/AndroidRuntime(8917):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
03-27 17:27:45.173: E/AndroidRuntime(8917):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
03-27 17:27:45.173: E/AndroidRuntime(8917):     at android.os.Handler.dispatchMessage(Handler.java:99)
03-27 17:27:45.173: E/AndroidRuntime(8917):     at android.os.Looper.loop(Looper.java:123)
03-27 17:27:45.173: E/AndroidRuntime(8917):     at android.app.ActivityThread.main(ActivityThread.java:4627)
03-27 17:27:45.173: E/AndroidRuntime(8917):     at java.lang.reflect.Method.invokeNative(Native Method)
03-27 17:27:45.173: E/AndroidRuntime(8917):     at java.lang.reflect.Method.invoke(Method.java:521)
03-27 17:27:45.173: E/AndroidRuntime(8917):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
03-27 17:27:45.173: E/AndroidRuntime(8917):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
03-27 17:27:45.173: E/AndroidRuntime(8917):     at dalvik.system.NativeStart.main(Native Method)
03-27 17:27:45.173: E/AndroidRuntime(8917): Caused by: java.lang.NoClassDefFoundError: com.google.zxing.ResultMetadataType
03-27 17:27:45.173: E/AndroidRuntime(8917):     at records.model.CaptureActivity.<clinit>(CaptureActivity.java:94)`
10个回答

38

我不必把jar库放到assets或lib文件夹中,只需要在“属性”->“Java构建路径”->“排序和导出”中勾选此jar的复选框即可(它之前已被列出,但未被选择)

这样做后,您可能需要执行项目>清理才能生效!(感谢mwengler和Mohamed的提示)


1
这个方法对我有用,我在项目>清理后成功了。如果它对你有用,请点赞,以便其他遇到问题的人也能找到它。(最好@Kishore能接受这个答案。) - mwengler
@mwengler 感谢您的干净提示,只有在我进行清理时才有效。@Till 感谢您的有用回答,请您在回答中提到“清理”,因为只有通过清理才能使它对我起作用! - Mohamed A.Karim
我在升级Android SDK后遇到了同样的问题。而这种方法是有效的。 - flypen

11

前往 Properties -> Java Build Path -> "Order and Export"。

然后将 core.jar 排到第一位并选中它!

在进行以上操作后,您必须清理项目。Project -> clean

这样就可以解决问题了。


1
将其置于顶部对我来说并不是必要的。我只需要勾选复选框即可。啊,这必须针对zxing库和您的应用程序进行操作。 - Markus Rudel

1
由于某些原因,ADT不再在生成的.apk文件中包含来自构建路径的库。
要解决此问题,请在项目的根目录(即bin、src、assets、libs)中创建一个“libs”文件夹,并将core.jar文件放入其中。从构建路径中删除所有其他实例,一切都应该正常工作。
{{link1:NoClassDefFoundError - Eclipse和Android}}

1
您正在引用位于CaptureActivity.java文件的第94行的com.google.zxing.ResultMetadataType类,但找不到该类的定义(ClassDefNotFound)。如果找不到该类,则可能未在您的类路径中。
您的磁盘上可能有某个.jar文件包含了com.google.zxing.ResultMetadataType类(似乎是core.jar),请将其放置在项目的类路径上以解决此问题。

我已经将core.jar添加到资产文件夹中并进行了配置。 - Kishore
您能确认这是适当的core.jar吗?如果您将其作为zip文件打开,能否找到com.google.zxing.ResultMetadataType - Andy Smith
如果我打开,那里会有 com.google.zxing.ResultMetadataType.class 文件。 - Kishore
1
啊,你按照这里描述的步骤进行了吗:https://dev59.com/_XE95IYBdhLWcg3wlu0g#2248017(特别是第三步和第四步) - Andy Smith

1

这对我有用(折腾了大约8个小时后)。 关键是您需要在CaptureClient项目中创建libs文件夹,放入core.jar,然后添加对core.jar的引用。

然后从您的项目中引用CaptureClient项目。

哇,那比它应该的难度高了一百万倍!

https://dev59.com/_XE95IYBdhLWcg3wlu0g#2248017


0
在我的情况下,问题出在Android Build Tools上。我使用的是18版本,但需要使用Android Build Tools 19或更高版本,因为我需要将eclipse JDK兼容性提升到1.7,而不是CORE.JAR使用Java 1.7版本。
我还建议查看构建过程中Android控制台中的消息,这将让您了解确切的问题。

0

我遇到了同样的问题,但是我正在使用新的Gradle构建和Adroid Studio。

对我有用的解决方法是在Android Studio外部使用gradle从命令行进行清理和构建:

gradle clean
gradle assembleDebug 

然后 NoClassDefFound 异常神奇地消失了


0
将 core.jar 添加到 Android 项目的 libs 文件夹中,不要将其作为外部 jar 添加到 Java 构建路径中。

0

它的意思就是字面上的意思。你正在使用未实际包含在应用程序中的库代码。请确保项目中的core.jar内容作为库项目的一部分包含在您的项目中。


我已经将core.jar添加到资产文件夹中,并像这样配置了它 BuilPath-->config build-->Add jars。 - Kishore
当然可以,但是你还没有设置它来实际包含应用程序中的类! - Sean Owen

0

我也遇到了类似的问题,是在升级SDK和插件后使用不同的.jar文件时出现的。

Andrew在下面的回答中提供了链接stackoverflow.com/a/2248017/180295,其中第3点和第4点对我有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接