android导入第三方包(解决ClassNotFound错误)

=========================================================

引用了网上的一篇文章,写的很不错,又正好解决了我的问题

ADT17以上版本应该是舍弃了Reference包的引用

=========================================================


最近开发项目需要从google地图转换到高德地图,所以在原有工程的基础上,只需要导入高德地图的包即可,代码大致和google的一样。但是导入后,eclipse下不会提示错误,但是在模拟器执行的时候就会报错:NoClassDefFoundError错误。


先给出网上对此错误的提示:
---------------------------------------------------------------------------------------

Android中引入第三方Jar包的方法(java.lang.NoClassDefFoundError解决办法)

1、在工程下新建lib文件夹,将需要的第三方包拷贝进来。
2、将引用的第三方包,添加进工作的build path。
3、(关键的一步)将lib设为源文件夹。如果不设置,则程序编译可以通过,但运行的时候,会报:
java.lang.NoClassDefFoundError
---------------------------------------------------------------------------------------

一般我们导第三方包的步骤都是,右键工程----build path -configure build path 。在弹出的libraries里,我们选择 Add External JARs,然后选择导入包即可。(或新建一library-userlibrary)这样应该就不会有什么错误了,但是点击RunAs时,有时又会触发 conversion to dalvik format failed with error 错误。

看一下网上对此错误的提示:
---------------------------------------------------------------------------------------------------------------------------

   在eclipse开发Android项目时出现的很多问题都可以使用Project--------->clean来轻易解决。

   但如果出现说Android库找不到,或者不小心remove了Android系统库,怎么重新添加Android系统库呢?
在eclipse里面的Java Build Path里面是没法添加例如Android 2.1这样定义好的系统库。而我尝试手动添加
SDK 文件夹里面的Android.jar,结果出现了Conversion to Dalvik format failed with error 1问题了。折腾了
一番后,很多网友都说用Project clean可以解决,但对我的情况来说,没有用处。
   在百度找到解决方法了:
   修改项目classpath文件,这让我明白了,直接从其他正常项目里面把
<!-- 注意,这个.classpath文件在eclipse工作空间的硬盘存放位置对应工程项目目录下面 -->

     <classpathentry kind="lib"   path ="自定义jar的地址" />
修改成

<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
这样子刷新项目,Android系统库Android 2.1回来了,那个错误也解决了。

--------------------------------------------------------------------------------------------------------------------------

   这几天又遇到这样的问题了,但是.classpath文件里面已经包含了上面的con Path,后来在论坛
(http://www.eoeandroid.com/thread-53880-1-1.html)上找到新方法:

project -> properties -> android label, check a target from the project build target list
<!-- 这样有时候还是不能去掉错误,这时候注意,在进入project -> properties -> android后,下面有
一个is library项,把它勾上,再点击确定错误就OK了,我的错误就是这样解决的,一开始按照上面
以及后面的方法都解决不了,最后我看到有一个is library项,把它勾上再确定试一下OK,错误没了 -->


============================================================================


附:
上网上广为流传的解决方法:conversion to dalvik format failed with error 1的解决办法

android低版本工程(如1.5)放到高版本环境中(如2.2)可能会上述错误,解决方法如下:

   1、如果不修改android sdk版本,则使用project clean 命令作用于某工程即可。 (该处理方式
只是在高版本中兼容了低版本工程,未真正意义上的升级)

   2、如果修改android sdk版本,则需要以下几个步骤:
      1) 修改SDK
            选择工程,build path --> configure build path ---> library 删除引用的低版本SDK,
            然后add External JARs,选择高版本SDK,OK,保存

      2) 修改classpath文件

            该文件可能存在该项: <classpathentry kind="lib"   path ="你所指定的高版本的地址"
            把她修改成<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK" />
      3) 修改AndroidManifest.xml
            在AndroidManifest.xml文件中,application标签后添加<uses-sdk android:minSdkVersion="3"></uses-sdk>
      4) 修改default.properties(很重要)
             该文件最后一行(前面没用#的)target=android-3 该成target=android-8,保存。
      再看看你的工程和新建的android 2.2的工程结构就一样了。
-------------------------------------------------------------------------------------------------------------------------------------------------------------


貌似这样做还真把这个错误给解决了,反正我把progect --properties--android 下的 is library够选上,果然错误就没了,可是运行起来还是会报错。

现在我才发现原来错误不是在eclipse里的build path内。

我尝试着修改了一下电脑java的环境变量,有了惊奇的发现:
在我的电脑的环境变量中,classpath 原本是空的,我添加了如下的变量:
.;C:\Program Files\Java\jdk1.5.0_17\lib;C:\Program Files\Java\jdk1.5.0_17\lib\tools.jar
尤其是开始的.;这个是最为重要的。
少了 < .; > 就造成巨大的差别
在�]有做任何设定之下 , 预设的CLASSPATH就是一个 .
这个 .代表 命令提示字元的当前目录
没设定比设定错误还要好一点(对新手而言) , 只要 .class 在当前目录 , 还是可以执行程序的

但是你若下了设定
SET CLASSPATH=C:"j2sdk1.4.1_03"lib;C:"j2sdk1.4.1_03"lib"tools.jar;
少了这个.若你当前的目录却不是 C:"j2sdk1.4.1_03"lib , 就��发生NoClassDefFoundError

正�_的�O定
SET CLASSPATH=.;C:"j2sdk1.4.1_03"lib;C:"j2sdk1.4.1_03"lib"tools.jar;
表示��前的目� , C:"j2sdk1.4.1_03"lib" , 以及 tools.jar �鹊�class都可以�d入 。



事实证明,主要原因并不是classpath的问题,来到公司,用同样的方法尝试还是运行报错,仔细一想:两台电脑,除了操作系统,eclipse版本不一样,别的没什么不同,群里问了一下,突然发现不同的是ADT的版本,公司电脑上的是18版本,而我家里或别的同事能运行的都是16版本,恍然大悟,
搜索一下,故知道了真正的的原因:


      最新的ADT都会自动生成一个Referenced Libraries,这个里面自动导入程序libs里的第三方jar包,或是手动在build path里添加的本地第三方jar包的路径。有了这个,程序运行就不会报错,这个是自动生成的,如果导入包后没有生成,clean或重新启动eclipse一下就会出现,自动关联。(无论是程序libs下还是本地路径下)。


网上搜索给出的原因:
------------------------------------------------------------------------------------------------------------------------------------------------------
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团队


你可能感兴趣的:(android,包,第三方,google地图)