• 如何解决ADT17下Android第三方jar包NoClassDefFoundError的错误


    转自:http://blog.csdn.net/huzgd/article/details/7604069本人已试过第二种解决方法可行!!

    原文:Posted by Foxykeep on 22/03/2012

    http://android.foxykeep.com/dev/how-to-fix-the-classdefnotfounderror-with-adt-17

     

    在升级了我的Android SDK和ADT到版本17后,我又遇到了一个大问题:)

     

    在使用了第三方JAR包的工程中,我仍然能正常编译,但只要在手机上一运行,程序就会直接崩溃,错误信息如下:

     

    [plain] view plaincopy
    1. <span style="font-size:16px;">03-21 19:20:56.455: E/AndroidRuntime(24471): FATAL EXCEPTION: main  
    2. 03-21 19:20:56.455: E/AndroidRuntime(24471): java.lang.NoClassDefFoundError: org.acra.ACRA  
    3. 03-21 19:20:56.455: E/AndroidRuntime(24471): at com.foxykeep.myproject.HomeActivity.onCreate(MyProjectApplication.java:127)  
    4. 03-21 19:20:56.455: E/AndroidRuntime(24471): at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:969)  
    5. 03-21 19:20:56.455: E/AndroidRuntime(24471): at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3925)  
    6. 03-21 19:20:56.455: E/AndroidRuntime(24471): at android.app.ActivityThread.access$1300(ActivityThread.java:122)  
    7. 03-21 19:20:56.455: E/AndroidRuntime(24471): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1184)  
    8. 03-21 19:20:56.455: E/AndroidRuntime(24471): at android.os.Handler.dispatchMessage(Handler.java:99)  
    9. 03-21 19:20:56.455: E/AndroidRuntime(24471): at android.os.Looper.loop(Looper.java:137)  
    10. 03-21 19:20:56.455: E/AndroidRuntime(24471): at android.app.ActivityThread.main(ActivityThread.java:4340)  
    11. 03-21 19:20:56.455: E/AndroidRuntime(24471): at java.lang.reflect.Method.invokeNative(Native Method)  
    12. 03-21 19:20:56.455: E/AndroidRuntime(24471): at java.lang.reflect.Method.invoke(Method.java:511)  
    13. 03-21 19:20:56.455: E/AndroidRuntime(24471): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)  
    14. 03-21 19:20:56.455: E/AndroidRuntime(24471): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)  
    15. 03-21 19:20:56.455: E/AndroidRuntime(24471): at dalvik.system.NativeStart.main(Native Method)</span>  

     

    于是我在Google+上问了Xavier Ducrohet和Tor Norbye(两者都是ADT插件的开发人员)关于此问题的原因,他们给了我这个页面链接(http://tools.android.com/recent/dealingwithdependenciesinandroidprojects),解释了如何去解决此问题,但解释得不是非常清晰(至少对我是这样)。

     

    关于这个问题,下面我截的这几个图能更容易地说清楚:


     

    从左到右三个图分别是:
    1.我的ADT16版的工程(三个截图的细节图标有些不一样,因为第一个是Windows的Eclipse下截的图,而另两个是在Mac的Eclipse下截的)
    2.我修复前的ADT17版工程
    3.我修复后的ADT17版工程


    从中我们可以看到:
    1.蓝色方框中的内容变化,是由新版补丁引起的(后面详细说明)
    2.红色方框的内容变化,是我做的修复工作的结果


    我所做的修复工作如下:
    1.从标准的Java编译路径中移除第三方JAR包
        在工程名称上点右键 > Properties > Java Build Path > Libraries标签 >移除Android SDK之外的所有第三方JAR包
    2把JAR包所在的文件夹名称从“lib”修改为“libs”
        这样做之后,ADT能自动找到所有在libs文件夹下的JAR包,把他们加到工程的依赖路径中,并直接显示在Android Dependecies分类下。
    3.清理整个工程(可能需要也可能不用)
    4.完成修复,可以正常运行了


    导致此问题的原因,是新版的ADT管理JAR包的方式发生成变化,旧版支持两种不同的JAR包引用(一是Android工程的库,另一个是标准的库),新版则把这两者合并到Android Dependencies下了。


    另外,新增加的annotations.jar提供了新的优化提示功能(更新信息请参阅http://tools.android.com/recent/ignoringlintwarnings


    除了这个小问题,新版的ADT17看起来很不错,我也很喜欢新的优化检查功能。


    【更新】
    开发团队DroidUX找到另一个解决此问题的办法,我没有亲自测试,但看起来应该也行得通,内容如下:

     

    嗨,各位:

    下面是问题的解决办法:

    如果你引用了不在libs目录下的第三方JAR文件,比如你用了“classpath”变量,你可以通过导出引用来解决ADT17下报NoClassDefFoundError错误的问题。

    导出引用的步骤:只需要转到“Properties > Java Build Path > Order and Export”,然后把你想要导出引用的全部勾选上就可以了。

    祝顺利!

    ——DroidUX团队

  • 相关阅读:
    ASP.NET Web API 控制器执行过程(一)
    ASP.NET Web API 控制器创建过程(二)
    ASP.NET Web API 控制器创建过程(一)
    ASP.NET Web API WebHost宿主环境中管道、路由
    ASP.NET Web API Selfhost宿主环境中管道、路由
    ASP.NET Web API 管道模型
    ASP.NET Web API 路由对象介绍
    ASP.NET Web API 开篇示例介绍
    ASP.NET MVC 视图(五)
    ASP.NET MVC 视图(四)
  • 原文地址:https://www.cnblogs.com/luoyanli/p/3164812.html
Copyright © 2020-2023  润新知