【问题标题】:java.lang.NoClassDefFoundError in Eclipse, but not with AntEclipse 中的 java.lang.NoClassDefFoundError,但 Ant 没有
【发布时间】:2011-12-12 12:51:58
【问题描述】:

我对一些 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 编译这个确切的项目时,通过使用命令ant debug 然后ant installd,应用程序运行得很好,包括启动活动。因此,完全相同的项目设置在 Ant 上运行良好,但在 Eclipse 上却不行。

我尝试了通过谷歌搜索找到的技巧,例如清理所有项目、删除特定项目的 .project 和 .classpath 并重新生成它们。我还通过将清单文件与工作项目中的清单文件进行比较来确保我的清单文件是正确的。无论我做什么,我都会再次遇到这个问题。由于它在 Ant 上编译和运行都很好,在我看来项目本身没有任何问题,但我确实需要能够通过 Eclipse 编译它。

编辑: 我刚刚用 dexdump 工具反编译了 Eclipse 创建的 apk 中的 classes.dex,并且能够确认该类与 apk 捆绑在一起。我找到了一个具有正确类描述符和实例字段的类。另一方面,我也对Ant生成的版本进行了反编译,得到了相当多的差异。太多了,这里就不重复了。使用 Ant 和 Eclipse 生成的文件应该是一样的吗?

【问题讨论】:

    标签: java android eclipse ant noclassdeffounderror


    【解决方案1】:

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

    【讨论】:

    • 因为同样的问题,我见过java.lang.VerifyError。库类在catch 子句中使用,因此库的问题被检测到早一点(比在方法调用的情况下),并表现为不同的异常。
    【解决方案2】:

    有时 android 插件不能很好地生成导致此类问题的资源。尝试以下简单程序:

    1. 在其中一个布局 xml 中更改一些 id 并保存 xml(项目中的任何布局都可以)。
    2. 插件编译后的项目改回id并保存。

    如果是这个问题,应该在项目编译后解决。

    【讨论】:

    • 我在库项目中更改了一个id,在使用库项目的项目中更改了一个id,但仍然没有运气。应用程序在完全相同的行崩溃,并显示完全相同的消息。
    【解决方案3】:

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

    这很糟糕,但至少它有效。

    【讨论】:

      猜你喜欢
      • 2016-11-26
      • 2019-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-22
      • 1970-01-01
      • 1970-01-01
      • 2019-06-23
      相关资源
      最近更新 更多