Android 運行時找不到類:java.lang.NoClassDefFoundError:...

在使用百度定位SDK時發生這種問題:java.lang.NoClassDefFoundError: com.baidu.location.LocationClient  html

問題出錯過程: java

工程原來是在R12版本下開發的,後來爲了追風,我就換掉R12,改爲使用R21.1了。而後從svn上檢出R12版本下開發的代碼(這個代碼在R12下運行是徹底沒有錯誤的)。問題就來了,一旦運行代碼,就報java.lang.NoClassDefFoundError。 android


第一次報的是我繼承的BDLocationListener的Listener找不到,private class MyBDListener implements BDLocationListener 。我認爲是在打包代碼的時候出現問題,因而我就不使用繼承直接在LocationClient.registerLocationListener(new BDLocationListener(){}),直接作了個內部類。這樣果真不在包找不到Listener的錯誤了。可是接着就又報錯:java.lang.NoClassDefFoundError: com.baidu.location.LocationClient。稍微分析一下,就以爲這不是我本身代碼問題了,是第三方jar包問題啊,首先想到的是:是否是混淆的時候將其混淆了,而後就找不到這個類了?因而在proguard.cfg中添加配置以下:-keep class com.baidu.**{*;} 這樣就不混淆了吧。因而再次運行,仍是報一樣的錯誤。排除混淆錯誤後,就真沒遇到過這樣的問題了,而後百度了下,有人也遇到這個問題了,他使用的R16,將lib改爲libs就沒問題了,可是個人工程中,jar明明就是在libs文件下!並且代碼在以前的版本都能正常運行,在高版本下就不行了,確定不是代碼問題,必須是環境問題啊。經驗這樣告訴我。既然以爲是環境問題就確定是高低版本區別之處出問題了,因而想固然的想到了bin目錄,打開以後果真發現有幾個隱藏頗深的紅色×。想都沒想,果斷刪之。若是你是在eclipse中刪除的話,他只是刪除了裏面的幾個文件,根本沒有刪除乾淨,紅×照樣在眼前。爲了完全刪除,關閉eclipse,而後經過資源管理器找到該bin而後刪除,從新打開eclipse,通常等eclipse刷新加載編譯完畢應該就沒錯了。可是個人仍是報錯,因而就clean下工程,而後紅色×就不見了。既然不見了,說明就沒問題了唄。因而從新運行工程,錯誤果斷沒有了,成功進入主界面。 eclipse


總結相似找不到第三方jar中class的解決辦法: svn

一、若是你是R16版本,而且你的jar仍是lib文件下,那麼你先將lib rename爲libs,而後clear工程試試還有沒有問題
二、若是還不成功,你能夠試探着將第三方的混淆給去掉,有些時候,就是由於混淆了第三方的代碼,致使找不到第三方的類。在proguard.cfg文件中添加配置 例如:-keep class com.baidu.**{*;}
三、若是你是從低版本轉移到高版本,出現某些難以想象的問題,好比在低版本正常運行的代碼,在高版本中出錯了,你稍微從高低版本的不一樣處找一下緣由。好比我:刪除bin而後讓他自動生成下。而後的而後就沒問題了。
四、若是你跟我上次遇到的問題同樣,類找到了,可是發現類中的某個方法找不到,那麼,你就考慮下是否是衝突問題,改一下你類的包名。(這中問題通常出如今開源代碼生成的jar中,不常見)。

編碼

最後但願對遇到相似問題的人有所幫助。
                          ——生命不息,編碼不止
spa

相關文章
相關標籤/搜索