在Eclipse中出现java.lang.NoClassDefFoundError错误,但在Ant中却没有。

3
我在使用Android项目和Eclipse时遇到了一个相当奇怪的问题。我有许多Android项目都使用了相同的大量代码,因此将大部分代码移入了一个Android库项目中。这对于三个应用程序很长一段时间以来一直运作良好。今天,我想为第四个应用程序也使用该库,却遇到了麻烦。基本上情况如下:
  • 库项目:包含一组活动以及一些实用类
  • 新项目:在某种情况下实例化库项目中的一个活动。
这应该是非常简单的事情,我甚至在另外三个应用程序中完全相同的库项目中使用了完全相同的活动。在新项目中,我已经在项目属性中引用了库项目,并将库项目中的活动添加到了AndroidManifest.xml文件中。Eclipse现在识别了这一点,并允许我引用该活动。一切都很好。
应用程序在执行启动库项目中的活动的操作时正常运行,但然后退出了,logcat告诉我以下信息:
FATAL EXCEPTION: main
java.lang.NoClassDefFoundError: no.company.application.base.SomeDetailActivity
    at no.company.someotherapplication.SomeListActivity$4.onClick(SomeListActivity.java:466)
    at android.view.View.performClick(View.java:2538)
    at android.view.View$PerformClick.run(View.java:9152)
    at android.os.Handler.handleCallback(Handler.java:587)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:123)
    at android.app.ActivityThread.main(ActivityThread.java:3691)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:507)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
    at dalvik.system.NativeStart.main(Native Method)

这是一个有趣的开始。我“知道”库项目与.apk捆绑在一起,因为我有一些来自该项目的实用代码正在运行。但是,当使用命令“ant debug”然后“ant installd”从Ant编译此确切项目时,应用程序可以正常运行,包括启动活动。所以,完全相同的项目设置可以使用Ant正常运行,但无法使用Eclipse。
我尝试了通过谷歌搜索找到的技巧,例如清理所有项目,删除特定项目的.project和.classpath,并重新生成它们。我还通过将其与工作项目的清单文件进行比较来确保我的清单文件正确。无论我做什么,最终都会再次遇到这个问题。由于使用Ant编译和运行非常顺利,所以对我来说,项目本身没有任何问题,但我确实需要能够通过Eclipse编译它。
编辑:我使用dexdump工具反编译了Eclipse创建的apk中的classes.dex,并能够确认该类已捆绑到apk中。我找到了一个具有正确类描述符和实例字段的类。另一方面,我也反编译了Ant生成的版本,并得到了很多不同之处。太多了,不能在此重复。使用Ant和Eclipse时生成的文件是否应该相同?
3个回答

2

我遇到了同样的问题。在我的情况下,我已经正确设置了Java构建路径,但是忘记添加库。请转到属性 -> Android,然后在“库”部分中单击“添加...”,然后添加库项目。之后它就可以按预期运行了。


我曾经因为同样的问题看到了 java.lang.VerifyError。库类在 catch 语句中使用,所以与该库相关的问题被稍早地检测出来(而不是在方法调用的情况下),并表现为不同的异常。 - 18446744073709551615

0
有时候 Android 插件生成资源时不太完整,会导致此类问题。请尝试以下简单步骤:
  1. 更改其中一个布局 XML 中的某些 ID,并保存该 XML(项目中的任何布局都可以)。
  2. 插件编译项目后,将 ID 改回并保存。

如果这是问题所在,则在项目编译完成后应该解决了它。


我在库项目中更改了一个ID,在使用库项目的项目中也更改了一个ID,但仍然没有运气。应用程序在完全相同的行上崩溃,并显示完全相同的消息。 - Bendik

0

我通过将jar包包含在最终项目的构建路径中解决了问题。显然库的构建路径是不够的。

虽然很烦,但至少它能工作了。


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