2012-07-06 70 views
2

爲什麼某些Java代碼在打包爲APK並部署到Android設備時不能運行/工作?像Google Guice,Apache Camel和其他許多項目。難道這不全是純粹的Java嗎?爲什麼有些東西不能在其上運行?

+0

Java的語言,是的,「Java」類的集合 - 是有很多重疊,但也有關鍵的區別。 – 2012-07-06 18:43:57

回答

1

「Plain ole'Java」或「100%純Java」實際上並不存在於語言規範之外。您正在處理完全不同的虛擬機模型和不同的類庫。 The Dalvik VM沒有實現與桌面JVM實現兼容的目的(Sun/Oracle,OpenJDK等)。它甚至不直接運行Java字節碼;它被編譯爲一個Dalvik特定的指令集,否則就會被破壞,試圖創建更小的可執行程序包,並在通常資源受限的移動平臺上運行良好。

+0

感謝@Donald(+1) - 那麼關於什麼庫/包不能在Android上運行的「經驗法則」是什麼?!我如何知道我的項目依賴關係是否是「Android安全的」? – IAmYourFaja 2012-07-06 19:17:01

+0

您應該查閱[Android SDK文檔](http://developer.android.com/sdk/index.html)以查看平臺上是否有特定的類庫。如果你指的是第三方的依賴關係,那麼它不如將一個jar文件扔到你的apk中並部署它那麼簡單;您將需要Java源代碼,並且必須使用SDK重建它,才能在Dalvik上正常運行。這可能涉及或可能不涉及一些調整,以使其建立。 – 2012-07-06 19:28:58

2

不需要。有很多自定義庫和框架可幫助管理應用程序的生命週期。

我不確定駱駝和吉斯是什麼。然而,(如果我錯了,請糾正一下)是Android框架。操作系統有辦法安排要運行的東西。這是您的應用程序的整個生命週期。如果你只是開始運行純Java代碼,那麼操作系統的鉤子是什麼?它需要一些東西來控制。我想在理論上你的代碼可以在DM中快樂地運行,但我懷疑它不會很好地與任何東西配合。

+0

我很感激你花時間回答@Frank(+1),但是這並沒有向我解釋爲什麼駱駝(100%純Java)或者Guice不能在Android上運行。 – IAmYourFaja 2012-07-06 18:49:05

+0

Java編譯爲字節碼,無論它來自哪個框架(Guice,Camel或其他)。海報問題是合法的:爲什麼Android不運行一些Java包?我懷疑(正如已經指出的),一些基本的JRE類型與Dalvik如何實現它們之間存在一些差異,並且某些框架(如Guice是反射較大的)廣泛使用Dalvik沒有的類似類型。但這只是一個猜測。 – IAmYourFaja 2012-07-06 19:08:51

+0

哈哈。我知道這是一個加載的問題:) – 2012-07-06 19:17:31

1

讓我展開弗蘭克的答案。如果你從柴油機中取出發動機並將其放入普通汽車中,它會運行嗎?他們都是引擎。

簡短回答:Android想要安全。它不喜歡在褲子的位置上執行代碼。爲了運行Java代碼,它需要一個包裝器。該包裝是APK,並在某種程度上的Android清單。一旦Android看到這些東西,它就知道它的運行方式以及如何運行它。讓我們回到我的標準汽車柴油發動機的比喻。有可能完成這項工作,但是你必須做一些修改,以便汽車(Android)知道如何處理髮動機(柴油發動機)。

Android在它的核心運行Linux;在您的思維模式下,您應該能夠正確運行Linux本機應用程序?你可以看到我要去的地方。

甚至更​​短的答案:在許多方面,Android根本不是Java。這是它自己獨特的語言,有警告和怪癖,但語法相同。

+0

謝謝@user - 請看我的評論唐納德的答案 - 我對你有同樣的問題!再次感謝(+1)! – IAmYourFaja 2012-07-06 19:17:52

+0

基本上所有Java程序包和庫都應該在Android上運行(只要它們不尋找與硬件相關的東西)。但是,這並不意味着您可以簡單地將應用程序打包爲APK並繼續。您需要花時間設置活動,而不是使用Swing構建的UI。基本上,試圖運行一個用java編寫的應用程序而無需將它移植到android就好像在xbox上粘貼一個Playstation遊戲,只是因爲它們都是用C++編寫的 – user1449018 2012-07-06 19:23:59

+0

那麼爲什麼不用駱駝或Guice運行? – IAmYourFaja 2012-07-06 19:29:47

相關問題