Android 使用fastjson找不到fastjson包問題的解決方法

Kylin_Mountain發表於2014-01-07

JSON解析庫有很多,諸如Jackson,Json-lib,org.json,Gson和fastjson等,但是fastjson以其解析速度最快而脫穎而出。詳細的測試地址如下:
https://github.com/eishay/jvm-serializers/wiki/Staging-Results
fastjson是國內alibaba公司的wenshao開發的,專案Git地址:
https://github.com/alibaba/fastjson

今天測試了下發現fastjson挺好用,比Android自帶的org.json庫要好用多了。當然我沒有對fastjson的效能進行測試,只是因為Android自帶的不太好。
在普通的java專案下,只需要匯入fastjson.jar就可以,無需依賴其他包,這一點相比json-lib要好多,json-lib依賴五六個包。但是將fastjson.jar匯入Android工程後,在使用時會出現 java.lang.NoClassDefFoundError:can`t find com.alibaba.fastjson.JSON等錯誤訊息。

初步認為是與Android自帶的org.json衝突。於是Build Path->Configure Build Path->Order And Export下將fastjson.jar上調至Android xx.jar上(xx為android 版本號)。再執行工程,這個錯誤不再出現了,奇蹟般的沒問題了。

然後現在再調整fastjson.jar和Android.jar順序也不會出現can`t not find com.alibaba.fastjson的錯誤,不知道為何,繼續看。

文章Java虛擬機器類載入順序講解了java 虛擬機器載入class和jar包的順序。
bootstrap classloader ->extension classloader->system classloader
其中bootstrap引導類載入器;
extension classloader擴充套件類載入器,它負責載入JRE的擴充套件目錄(JAVA_HOME/jre/lib/ext或者由java.ext.dirs系統屬性指定的)中JAR的類包;
system classloader系統(也稱為應用)類載入器,它負責在JVM被啟動時,載入來自在命令java中的-classpath或者java.class.path系統屬性或者 CLASSPATH作業系統屬性所指定的JAR類包和類路徑.
該文中還有一句話是這麼說的,應該能解決我們的疑惑:

“此外類載入還採用了cache機制,也就是如果 cache中儲存了這個Class就直接返回它,如果沒有才從檔案中讀取和轉換成Class,並存入cache,這就是為什麼我們修改了Class但是必須重新啟動JVM才能生效的原因。”

我想應該是Android虛擬機器中已經有了fastjson的cache了,所以導致如何更改專案的fastjson.jar和Android.jar順序都不會有任何反應。我的理解是這樣,不知道對不對,歡迎大俠指正。

解釋到這裡,也解決了我另外一個疑問,就是在Android的工程中新建一個java類,並生成main方法,然後Run->Java Application. 結果會出現如下的錯誤:

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  Internal Error (classFileParser.cpp:3494), pid=5940, tid=5632
#  Error: ShouldNotReachHere()

這個問題的產生就是和bootstrap classloard 有關了,檔案上右鍵Run As->Run Configuration選擇Java Application下的這個Java類,然後選擇右側的Classpath標籤頁下有兩個目錄,分別是Bootstrap Entries 和 User Entries。
Android工程中Bootsrap下預設的是Android Classpath Container,而Java則應該是JRE System Library。所以按照該文Error: ShouldNotReachHere()的解決方法,更改就好了。

相關文章