【问题标题】:Android java.lang.NoClassDefFoundError using JODA librariesAndroid java.lang.NoClassDefFoundError 使用 JODA 库
【发布时间】:2012-05-13 07:49:02
【问题描述】:

我在一个我认为很容易解决的问题上被困了大约 2 个小时。 我正在为 android 平台构建一个自定义日期时间选择器,由于标准 java.util.Calendar 和 java.util.Date 类的速度很慢,我决定使用 JODA 库。

不幸的是,我没有使用“JAR”引用的经验(请原谅我......我来自 COM 和 .NET 程序集世界 =)......),但我在互联网上学习了一些技巧,但显然它们似乎是错误的... 这些是我在项目中使用该库所采取的步骤:

  1. 下载最新的JODA库2.1
  2. 在我的项目文件夹中创建“lib”文件夹
  3. 将“joda-time-2.1.jar”添加到“lib”文件夹。
  4. 将“joda-time-2.1.jar”库添加到构建路径。
  5. 将“joda-time-2.1-javadoc.jar”和“joda-time-2.1-sources.jar”添加到“lib”文件夹中
  6. 将上述库设置为 joda-time-2.1 引用库的“java 源附件”和“javadoc 位置”。
  7. 在我的代码中使用新库(ehm ehm 'intelli-sense' 和编译器不会抛出任何错误或警告)
  8. 在真实或虚拟设备上开始调试。

当涉及到以下行(使用 JODA BTW 的第一行)时,调试停止:

DateTime newDate = new DateTime(2012, 5, 3, 12, 0, 0);

并返回以下堆栈跟踪:

05-03 19:09:14.349: E/AndroidRuntime(4071): java.lang.NoClassDefFoundError: org.joda.time.DateTime
05-03 19:09:14.349: E/AndroidRuntime(4071):     at it.paganel.droidMessageExport.Control.TimePickerControl.SetTimePart(TimePickerControl.java:83)
05-03 19:09:14.349: E/AndroidRuntime(4071):     at it.paganel.droidMessageExport.Control.TimePickerControl.onClick(TimePickerControl.java:116)
05-03 19:09:14.349: E/AndroidRuntime(4071):     at android.view.View.performClick(View.java:2454)
05-03 19:09:14.349: E/AndroidRuntime(4071):     at android.view.View$PerformClick.run(View.java:9030)
05-03 19:09:14.349: E/AndroidRuntime(4071):     at android.os.Handler.handleCallback(Handler.java:587)
05-03 19:09:14.349: E/AndroidRuntime(4071):     at android.os.Handler.dispatchMessage(Handler.java:92)
05-03 19:09:14.349: E/AndroidRuntime(4071):     at android.os.Looper.loop(Looper.java:123)
05-03 19:09:14.349: E/AndroidRuntime(4071):     at android.app.ActivityThread.main(ActivityThread.java:4641)
05-03 19:09:14.349: E/AndroidRuntime(4071):     at java.lang.reflect.Method.invokeNative(Native Method)
05-03 19:09:14.349: E/AndroidRuntime(4071):     at java.lang.reflect.Method.invoke(Method.java:521)
05-03 19:09:14.349: E/AndroidRuntime(4071):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:870)
05-03 19:09:14.349: E/AndroidRuntime(4071):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:628)
05-03 19:09:14.349: E/AndroidRuntime(4071):     at dalvik.system.NativeStart.main(Native Method)
05-03 19:09:14.349: E/AndroidRuntime(4071): Caused by: java.lang.ClassNotFoundException: org.joda.time.DateTime in loader dalvik.system.PathClassLoader[/data/app/it.paganel.droidMessageExport-2.apk]
05-03 19:09:14.349: E/AndroidRuntime(4071):     at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243)
05-03 19:09:14.349: E/AndroidRuntime(4071):     at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
05-03 19:09:14.349: E/AndroidRuntime(4071):     at java.lang.ClassLoader.loadClass(ClassLoader.java:532)
05-03 19:09:14.349: E/AndroidRuntime(4071):     ... 13 more

有人可以帮助我吗? 提前致谢!

【问题讨论】:

  • 您对 DateTime 使用的导入语句是什么?
  • 我在另一台计算机上打开我的项目时遇到了同样的问题,Eclipse 可以针对库进行编译,但它在第一次调用 JodaTime 库 DateTime 构造函数时崩溃。

标签: android date jar jodatime


【解决方案1】:

将 lib 文件夹重命名为 libs。从 ADT Tools 开始,只有在此文件夹中的 17 个外部 jars 才会被打包到 apk 中。 或者,您可以转到“配置构建路径..”->“订购和导出”,然后单击 jar 旁边的复选框。

【讨论】:

  • 是的,我知道了!我错了文件夹名称...将其重命名为“libs”而不是“lib”,效果很好!但是当我使用 DateTime() 构造函数时,我注意到速度很慢。例如,要创建一个新的 DateTime 对象,我的 Samsung Omnia 2 带有 O2Droid 移植(基于 Froyo 版本),大约需要 30 秒。我的 Acer A500 带有 Honeycomb 的平板电脑,大约需要 3 秒...正常吗???这个问题与我用来引用 JAR 的方法有关吗?有人知道使用这个库提高性能的一些技巧吗?
  • 您可能想查看此讨论以获取有关启动缓慢的帮助:stackoverflow.com/questions/5059663/…
【解决方案2】:

对于可能正在寻找解决方案的其他人,我刚刚发现了另一个可能的原因:打开 Project>Properties>Java Build Path>Libraries 并检查 JodaTime 是否在 Android 下依赖项Android 私有库。然后确保在 Order and Export 选项卡上选中了相应的选项。我必须检查 Android Private Libraries(其中列出了 JodaTime)才能使其正常工作。

我认为这也适用于类似的问题,并且不一定与 JodaTime 相关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 2016-02-02
    • 2012-04-09
    • 1970-01-01
    相关资源
    最近更新 更多