修复NoClassDefFoundError的方法是什么?

7

可能重复:
NoClassDefFoundError - Eclipse and Android

我看到这个问题在许多不同的上下文中被问到。也许我们可以制定一些定位和修复它的策略?我自己也是新手,所以我能贡献的只有可怕的故事和问题,抱歉...

似乎当一个类在编译时可见但在运行时不可见时会抛出此异常...这是如何发生的呢?

在我的案例中,我正在使用 Google APIs 在 Eclipse 上为 Android 平台开发应用程序。我已经将 gdata .jars 包含在项目属性 / Java Build Path / Libraries 中,并且一切正常。但当我在模拟器中执行时,我收到一个强制关闭的错误,并且 logcat 显示在一个简单的 new ContactsService("myApp"); 上出现了 NoClassDefFoundError。我还尝试了一个 new CalendarService("myApp") ,结果相同。

是否可能或者说值得在编译时静态绑定以避免这个问题?

无论如何,在移动环境中如何进行附加库的动态绑定呢?它要么必须绑定到我的 .apk 中,要么我需要“安装”它?... 嗯。

非常感谢您的建议。

4个回答

9

在编译时可见但在运行时不可见的类会导致此错误,这是怎么发生的?

构建类路径可能包括未打包到 APK 中的 JAR 包。

是否可能或者说有必要在编译时静态绑定以避免这个问题?

这是可能、值得和必要的。

在 Eclipse 之外,只需将所需的 JAR 包放入项目的 libs/ 目录中,使用 Ant 编译即可。

在 Eclipse 中,我曾经成功地让学生采用以下模式:将所需的 JAR 包放入项目的 libs/ 目录中,将它们作为 JAR 包添加到构建路径中(注意:不是外部 JAR 包),它们将作为 APK 的一部分打包。请注意,我个人不使用 Eclipse,因此我的经验有限。


使用Eclipse的Android开发插件,项目构建路径中包含的任何JAR文件都将作为APK的一部分打包(只要您使用插件来构建APK)。这些JAR文件不必在项目内部或特定目录中。 - Mark B
最近有一连串的关于这个问题的投诉。我并不是Eclipse的用户。我看到在一个构建路径对话框选项卡上有“添加JAR”和“添加外部JAR”--如果你选择“添加外部JAR”,可能会有一些影响吗? - CommonsWare
我一直在使用“添加外部JAR”。我创建了一个libs目录并将gdata安装包直接移动到该目录中。然后我使用“添加JAR”,这些JAR文件显示为“引用库”,编译器也很满意。然后我进行了项目清理、重启Eclipse和模拟器,并运行了程序。但问题依旧。看起来好像是开发环境的bug?这个问题真让我头疼。。:) - DJC
在code.google.com的gdata-java-client讨论中:vbarathan 2/10/09 该客户端库并不适用于移动平台,主要是由于解析大型xml响应所需的内存占用问题...可能会有其他开源项目在不久的将来推出与移动兼容的库。类似的评论表明,谷歌API除了地图之外,在Android上根本无法使用。话虽如此,4天前发布了2.0 beta版本,并附有以下评论:“在Android上体验更好:库更小,更高效”... - DJC
跟进中...版本2客户端库已经从头开始重写,是与版本1不兼容的独立客户端库。版本2支持大多数(但还不是全部)版本1的主要功能,另外还增加了以下特性:支持Android(最低1.5 SDK),并且库文件更小... - DJC

2

对于那些遇到问题的人,我曾经也遇到过与我的应用程序相同的错误。我解决这个问题的方法是创建一个新项目,并将我的资源和源文件夹以及清单文件复制到新项目中(我提前删除了新项目中的那些文件),然后问题就解决了。


1

当我遇到这个问题时,实际上队列中的问题更深层次;Dalvik转换器未能转换一些引用库,但Eclipse仍允许我启动项目。

检查Android SDK控制台是否报告任何错误。


1
在我的情况下,我使用了自己的库(MyLib),它被两个应用程序共享。当我向库中添加一个新的类时,App A已经关闭。
当我打开App A进行工作时,Eclipse识别到了新的类,并且我可以引用它。然而,在运行时我却出现了错误。
原来是App A中导入的库文件夹(类似于MyLib_src)没有反映出对我的库项目(MyLib)所做的更改。
为了解决这个问题,我刷新了App A,更改得到了反映,Android也能正确地构建我的项目。
我没有找到关于这个问题版本的参考资料,所以想把它添加到这个列表中。

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