经过数月的艰苦工作我们很自豪的宣布我们的第一个稳定版 RoboVM 1.0 发布了!如果没有优秀的社区给予我们反馈、缺陷的追踪,这是不可能实现的。深深的感谢2000多个测试版的订阅者的贡献!
随着1.0的发布,我们希望我们的社区能够更深一步的壮大。基于此,我们将会揭开RoboVM的面纱,让新加入者对RoboVM是什么,它如何工作,以及我们推出它的动机有一个清晰的了解。如果你想了解更多信息,请查看 “什么是 RoboVM?” 更新了啥?1.0版本出现了很多新特性并修复了许多bug:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 | import org.robovm.rt.bro.*; import org.robovm.rt.bro.annotation.*; @Library ( "c" ) public class Abs { static { Bro.bind(); } @Bridge private static native int abs( int i); public static void main(String[] args) { System.out.println(abs(- 100 )); } } |
@Library 告诉编译器要链接哪个库或框架。 @Bridge 告诉编译器方法 abs 绑定的是名字相同的 C 函数。
这只是冰山一角。 RoboVM 能自动收集 Java 和原生代码之间复杂的数据类型。当然,你还可以绑定 C 的结构体, Objective-C 的类, 通过这些东西,就能完全访问 iOS 的框架和 API。 甚至可以继承 Objective-C 写的类!
Bro 能让你以简单自然的方式使用 iOS 的框架和 API 。像绑定 iOS 框架和 API 这些繁重的工作, 我们已经解决了。下面看一个自定义视图控件的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | public class MyViewController extends UIViewController { private final UIButton button; private final UILabel label; private int clickCount; public MyViewController () { // Get the view of this view controller. UIView view = getView(); // Setup background. view.setBackgroundColor(UIColor.white()); // Setup label. label = new UILabel( new CGRect( 20 , 250 , 280 , 44 )); label.setFont(UIFont.getSystemFont( 24 )); label.setTextAlignment(NSTextAlignment.Center); view.addSubview(label); // Setup button. button = UIButton.create(UIButtonType.RoundedRect); button.setFrame( new CGRect( 110 , 150 , 100 , 40 )); button.setTitle( "Click me!" , UIControlState.Normal); button.getTitleLabel().setFont(UIFont.getBoldSystemFont( 22 )); button.addOnTouchUpInsideListener(() -> { label.setText( "Click Nr. " + (++clickCount)); }); view.addSubview(button); } } |
MyViewController 类继承Objective-C 类的子类 UIViewController! 其余的代码流程,尤其是对于 Java 8 lambdas 来说再自然不过了。
RoboVM会一直兼顾与Objective-C 自动引用计数(Automatic Reference Counting (ARC)) 的相互作用机制。RoboVM会做“正确的东西”,所以你不必想它太难。你需要与ARC交互,RoboVM可以让你做到这些。
绑定到iOS框架和API后会半自动生成。如果你希望为一个存在的iOS库创建一个绑定,你应该使用我们的绑定生成器并根据你的需要修改,迄今为止,我们已经覆盖了所有iOS8.1框架和API的98%。
现在,并不是每一个场景都可以写两个单独的UI层。尤其是在企业中,对快速得到结果有需求,对UI本地观感可以折中,在这个使用案例中,我们在iOS和安卓平台上提供JavaFX。这个方法允许你在两个平台上100%共享你的代码。我们的合作伙伴LogdON确保JavaFX能工作在iOS和安卓平台。
调试器
RoboVM 商业许可证允许你对 Java 调试线协议(JDWP)兼容调试器的访问。JDWP 允许你从 IDE 内部调试 Java 进程。同时,RoboVM 支持 JDWP,因此你可以调试这两个应用程序模拟器与设备。使用你曾经使用的工具。
RoboVM 的实现,一个软件调试器:在特定的安全点上,运行时配合调试器;在用户代码中实现线程暂停,步进,断点和内存检查。在调试模式中,应用程序将通过 TCP 监听命令来旋转一个额外的线程。在另一边的 TCP 通道正坐落着我们的 JDWP 服务器,实现我们自定义的顶部协议以及最小的调试协议。
诸如 GDB 与 LLDB 使用 OS 服务控制进程的替代。实际上,我们从一开始就着手对 LLDB 使用的调查,而不是直接决定反对它。首先,LLDB 是以流程为中心:如果一个线程停止,那么所有别的线程同时也停止。这不兼容 JDWP 的线程中心模式:你可以停止一个或者更多的线程,同时剩下的线程继续运行。决定反对 LLDB 的第二个原因是我们的 JDWP 服务器将必须通过 LLDB 来接管进程。这将避免你调试你的应用程序的本地端,同时也是调试 Java 端。就目前来看,你可以同时从你的 Java Ide 以及 XCode 来调试你的应用程序!
RoboVM 调试器允许你能够使用一个正常地 JVM 调试器来编写任何东西:暂停/恢复线程,设置(条件)断点,步进/出/源代码行,在运行时通过 Eclipse 的显示视图或者 Intellij IDEA 的“看表情”对话框来修改变量和调用方法,等等。所有的这工作都是在模拟器上和设备上运行。
IDE 集成
在 Robovm 之上运行的最大原因之一是把 JVM 周围的模具带到 iOS。
在过去的一年里,我们已经关注当前默认开发环境中的 Eclipse。我们 Eclipse 插件(更新url: http://download.robovm.org/eclipse/)支持这两个简单创建的控制台和 iOS 项目。它集成调试和对于一个顺利发展经验的 JUnit 支持。你也可以使用 Gradle 或者 Maven 对 Eclipse 来构建和持续集成。
Android 已经完全转换成基于 JetBrain 的 Intellij IDEA 之上的 Android Studio,。我们已经准备了一个 RoboVM Intellij IDEA 插件的初始版本并且正在努力把它当作 Eclipse 插件来使用。我们认识到支持 IDEA 与 Android Studio 的重要性,特别是在进行跨平台开发的时候。在即将到来的几周内,期待这个领域有更多新鲜事情发生。
最后,还有一些集成 NetBeans 相关的社区工作。
在所有功能实现后,我就能完美结合苹果公司提供的工具。现阶段我们的全部工作集中在整合界面生成器上,一旦完成就可以非常容易的创建 UI 视图。整合后的界面生成器将成为一个商业功能,计划于2015 年发布。
集成构建系统
RoboVM 支持多种构建系统,对于其中的困难,我们就交给 RoboVM 处理,你可以像其它编译器一样通过执行命令进行编译。这样你就可以使用shell脚本,整合RoboVM编译器,用于生产环境。
然而,我们强烈的建议使用已经建好的编译系统!我们创建了专门的 Maven 插件 ,正如 Gradle 插件一样,能让你们的生活相当容易。
进一步,我们提供的项目模板同 IDE 集成一样也包含了 Maven 原型,建立的不再仅仅是 iOS 项目,同时也是跨平台的,可用于 iOS 和 Android 项目。
现在,你应该已经对RoboVM 有了一个相当的了解,它如何能帮助你。如果我们激起了你的兴趣,前往我们的文档页面,并立即开始使用!
如果你只是想要查看一下代码,我们建议通过我们的苹果示例应用模版进行查看。
最后,如果你还不满足,你可以从 Github上获得 RoboVM 源码!
关于RoboVM
RoboVM 开源项目的目标是使Java和其它JVM语言运行在iOS平台上。RoboVM能够将Java字节码翻译成ARM或X86机器码,直接运行在CPU上无需解释字节码。它的运行环境包括一个基本的Android类库和Java到Objective-C桥,使Java或其它JVM语言能够容易使用本地IOS Cocoa Touch API。
Web site: http://www.robovm.com
GitHub: https://github.com/robovm/robovm
Google Groups: https://groups.google.com/group/robovm
Twitter: https://twitter.com/robovm