2012-07-06 48 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

相关问题