爲什麼某些Java代碼在打包爲APK並部署到Android設備時不能運行/工作?像Google Guice,Apache Camel和其他許多項目。難道這不全是純粹的Java嗎?爲什麼有些東西不能在其上運行?
回答
「Plain ole'Java」或「100%純Java」實際上並不存在於語言規範之外。您正在處理完全不同的虛擬機模型和不同的類庫。 The Dalvik VM沒有實現與桌面JVM實現兼容的目的(Sun/Oracle,OpenJDK等)。它甚至不直接運行Java字節碼;它被編譯爲一個Dalvik特定的指令集,否則就會被破壞,試圖創建更小的可執行程序包,並在通常資源受限的移動平臺上運行良好。
感謝@Donald(+1) - 那麼關於什麼庫/包不能在Android上運行的「經驗法則」是什麼?!我如何知道我的項目依賴關係是否是「Android安全的」? – IAmYourFaja 2012-07-06 19:17:01
您應該查閱[Android SDK文檔](http://developer.android.com/sdk/index.html)以查看平臺上是否有特定的類庫。如果你指的是第三方的依賴關係,那麼它不如將一個jar文件扔到你的apk中並部署它那麼簡單;您將需要Java源代碼,並且必須使用SDK重建它,才能在Dalvik上正常運行。這可能涉及或可能不涉及一些調整,以使其建立。 – 2012-07-06 19:28:58
不需要。有很多自定義庫和框架可幫助管理應用程序的生命週期。
我不確定駱駝和吉斯是什麼。然而,(如果我錯了,請糾正一下)是Android框架。操作系統有辦法安排要運行的東西。這是您的應用程序的整個生命週期。如果你只是開始運行純Java代碼,那麼操作系統的鉤子是什麼?它需要一些東西來控制。我想在理論上你的代碼可以在DM中快樂地運行,但我懷疑它不會很好地與任何東西配合。
我很感激你花時間回答@Frank(+1),但是這並沒有向我解釋爲什麼駱駝(100%純Java)或者Guice不能在Android上運行。 – IAmYourFaja 2012-07-06 18:49:05
Java編譯爲字節碼,無論它來自哪個框架(Guice,Camel或其他)。海報問題是合法的:爲什麼Android不運行一些Java包?我懷疑(正如已經指出的),一些基本的JRE類型與Dalvik如何實現它們之間存在一些差異,並且某些框架(如Guice是反射較大的)廣泛使用Dalvik沒有的類似類型。但這只是一個猜測。 – IAmYourFaja 2012-07-06 19:08:51
哈哈。我知道這是一個加載的問題:) – 2012-07-06 19:17:31
讓我展開弗蘭克的答案。如果你從柴油機中取出發動機並將其放入普通汽車中,它會運行嗎?他們都是引擎。
簡短回答:Android想要安全。它不喜歡在褲子的位置上執行代碼。爲了運行Java代碼,它需要一個包裝器。該包裝是APK,並在某種程度上的Android清單。一旦Android看到這些東西,它就知道它的運行方式以及如何運行它。讓我們回到我的標準汽車柴油發動機的比喻。有可能完成這項工作,但是你必須做一些修改,以便汽車(Android)知道如何處理髮動機(柴油發動機)。
Android在它的核心運行Linux;在您的思維模式下,您應該能夠正確運行Linux本機應用程序?你可以看到我要去的地方。
甚至更短的答案:在許多方面,Android根本不是Java。這是它自己獨特的語言,有警告和怪癖,但語法相同。
謝謝@user - 請看我的評論唐納德的答案 - 我對你有同樣的問題!再次感謝(+1)! – IAmYourFaja 2012-07-06 19:17:52
基本上所有Java程序包和庫都應該在Android上運行(只要它們不尋找與硬件相關的東西)。但是,這並不意味着您可以簡單地將應用程序打包爲APK並繼續。您需要花時間設置活動,而不是使用Swing構建的UI。基本上,試圖運行一個用java編寫的應用程序而無需將它移植到android就好像在xbox上粘貼一個Playstation遊戲,只是因爲它們都是用C++編寫的 – user1449018 2012-07-06 19:23:59
那麼爲什麼不用駱駝或Guice運行? – IAmYourFaja 2012-07-06 19:29:47
- 1. 爲什麼不可能嘗試/抓住一些東西?
- 2. 爲什麼我不能讓這些東西在同一行顯示?
- 3. 在反饋中運行一些東西
- 4. 爲什麼在我運行代碼時會安裝某些東西?
- 5. 爲什麼.net 4.0將所有這些東西寫入DebugView?
- 6. 這爲什麼不畫任何東西?
- 7. 爲什麼不刪除任何東西?
- 8. 如果有東西存在,請用東西做點什麼
- 9. 爲什麼有些服務器不能運行SED命令?
- 10. 在Mac OS上開發什麼東西?
- 11. 爲什麼b.isEm()在不同的行上打印不同的東西?
- 12. 什麼是!!和Ruby中的其他一些東西?
- 13. android在等什麼東西
- 14. 不能得到Grunt運行,嘗試了所有的東西
- 15. 不能在Android上安裝apk在Rasberry Pi上運行的東西3B
- 16. 爲什麼xmlrpc wordpress不能在一些活網站上運行,但在某些網站正在運行。
- 17. 不可能在字段上寫東西
- 18. 爲什麼我的OpenGL不能繪製任何東西?
- 19. 爲什麼我的函數不能返回任何東西?
- 20. 爲什麼我的最小功能不打印任何東西?
- 21. 爲什麼我的scrapy不能刮取任何東西?
- 22. 爲什麼我的「scrapy」不能刮取任何東西?
- 23. 爲什麼不能獲取括號之間的東西?
- 24. 爲什麼我的程序不能繪製任何東西?
- 25. 爲什麼這個ruby代碼不能返回任何東西?
- 26. 爲什麼我不能直接添加東西到UIScrollView?
- 27. jQuery Ajax返回HTML - 爲什麼我不能做它的東西
- 28. 爲什麼JavaScript只能在第一條記錄上運行,而不能在其他條目上運行
- 29. 爲什麼畫布上沒有任何東西出現?
- 30. SCJP有沒有什麼好東西?
Java的語言,是的,「Java」類的集合 - 是有很多重疊,但也有關鍵的區別。 – 2012-07-06 18:43:57