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

正確的設定
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都可以載入 。



事實證明,主要原因並不是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團隊


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章