使用JODA库的Android java.lang.NoClassDefFoundError

时间:2012-05-03 18:40:51

标签: android date jar jodatime

在我认为很容易解决的问题上,我被困了大约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 source attachements”和“javadoc location”。
  7. 将新库用于我的代码(ehm ehm'intelli-sense'和编译器不会抛出任何错误或警告)
  8. 在真实或虚拟设备上启动调试。
  9. 当涉及到以下行(第一个使用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
    
    有人可以帮帮我吗? 提前谢谢!

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:1)

对于可能正在寻找解决方案的其他人,我刚刚发现了另一个可能的原因:打开项目>属性> Java构建路径>库并检查JodaTime是否在 Android下依赖关系 Android私有库。然后确保在订单和导出选项卡上选中相应的选项。我必须检查 Android私人库(其中列出了JodaTime)才能使其正常工作。

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