{"id":8724,"date":"2013-03-08T20:54:51","date_gmt":"2013-03-08T11:54:51","guid":{"rendered":"http:\/\/www.softantenna.com\/wp\/?p=8724"},"modified":"2013-03-08T20:54:51","modified_gmt":"2013-03-08T11:54:51","slug":"robo-vm","status":"publish","type":"post","link":"https:\/\/softantenna.com\/blog\/robo-vm\/","title":{"rendered":"Java\u3067iOS\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u4f5c\u6210\u3067\u304d\u308b\u300cRoboVM\u300d"},"content":{"rendered":"<p><img decoding=\"async\" src=\"https:\/\/softantenna.com\/wp\/wp-content\/uploads\/2013\/03\/blogRoboVM-Develop-iPhone-and-iPad-Apps-in-Java-with-RoboVM.png\" alt=\"RoboVM  Develop iPhone and iPad Apps in Java with RoboVM\" title=\"RoboVM - Develop iPhone and iPad Apps in Java with RoboVM.png\" border=\"0\" width=\"560\" height=\"319\" \/><\/p>\n<p>\u300c<a href=\"http:\/\/www.robovm.org\/\">RoboVM<\/a>\u300d\u306fJava\u306e\u30d0\u30a4\u30c8\u30b3\u30fc\u30c9\u3092\u3001ARM\u307e\u305f\u306fx86\u30b3\u30fc\u30c9\u306b\u5909\u63db\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u308b\u30b3\u30f3\u30d1\u30a4\u30e9(\u30d5\u30ea\u30fc\u30bd\u30d5\u30c8\u3002GPLv2)\u3002\u3053\u308c\u3092\u4f7f\u3048\u3070Java\u8a00\u8a9e\u3092\u4f7f\u3063\u3066<strong>iOS\u30d7\u30ed\u30b0\u30e9\u30e0<\/strong>\u3092\u4f5c\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n<p>iOS\u7528\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u958b\u767a\u3057\u3066\u307f\u305f\u3044Java\u30d7\u30ed\u30b0\u30e9\u30de\u306b\u3068\u3063\u3066\u306f\u3001\u4fbf\u5229\u306a\u30c4\u30fc\u30eb\u306b\u306a\u308b\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002Android\u3068iOS\u3067\u30b3\u30fc\u30c9\u3092\u5171\u6709\u3059\u308b\u306a\u3093\u3066\u3053\u3068\u3082\u3067\u304d\u308b\u307f\u305f\u3044\u3067\u3059\u3002<\/p>\n<p><!--more--><\/p>\n<h3>\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/h3>\n<p>\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u65b9\u6cd5\u306f\u3001\u300c<a href=\"http:\/\/www.robovm.org\/docs.html#getting-started\">Getting started<\/a>\u300d\u306b\u8a73\u3057\u304f\u66f8\u3044\u3066\u3042\u308a\u307e\u3059\u304c\u3061\u3087\u3063\u3068\u3081\u3093\u3069\u3046\u3067\u3059\u3002<\/p>\n<ul>\n<li>Oracle\u306eJava SE 7\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3002\n<li>Xcode 4.5.2\u3092Mac App Store\u304b\u3089\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3002\n<li>Xcode\u306ePreferences\u30e1\u30cb\u30e5\u30fc\u304b\u3089\u3001Command Line Tools\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3057\u3066\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3002\n<li>\u4ee5\u4e0b\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3057\u3066\u3001LLVM tools\u3092\/opt\/llvm\u4ee5\u4e0b\u306b\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u3002\n<pre>\ncurl http:\/\/llvm.org\/releases\/3.2\/clang+llvm-3.2-x86_64-apple-darwin11.tar.gz > llvm.tar.gz\nsudo mkdir -p \/opt\nsudo tar xvfz llvm.tar.gz -C \/opt\nsudo rm -f \/opt\/llvm\nsudo ln -s \/opt\/clang+llvm-3.2-x86_64-apple-darwin11 \/opt\/llvm\n<\/pre>\n<\/ul>\n<h3>\u30b7\u30f3\u30d7\u30ebiOS\u30a2\u30d7\u30ea<\/h3>\n<p>\u540c\u3058\u5834\u6240\u306b\u7c21\u5358\u306aiOS\u30a2\u30d7\u30ea\u306e\u30b5\u30f3\u30d7\u30eb\u30d7\u30ed\u30b0\u30e9\u30e0\u304c\u63b2\u8f09\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u4ee5\u4e0b\u3092 IOSDemo.java \u3068\u3057\u3066\u4fdd\u5b58\u3057\u307e\u3059\u3002<\/p>\n<pre><code class=\"java\">import org.robovm.cocoatouch.coregraphics.*;\nimport org.robovm.cocoatouch.foundation.*;\nimport org.robovm.cocoatouch.uikit.*;\n\npublic class IOSDemo extends UIApplicationDelegate.Adapter {\n\n    private UIWindow window = null;\n    private int clickCount = 0;\n\n    @Override\n    public boolean didFinishLaunching(UIApplication application,\n            NSDictionary launchOptions) {\n  \n        final UIButton button = UIButton.fromType(UIButtonType.RoundedRect);\n        button.setFrame(new CGRect(115.0f, 121.0f, 91.0f, 37.0f));\n        button.setTitle(\"Click me!\", UIControlState.Normal);\n\n        button.addOnTouchUpInsideListener(new UIControl.OnTouchUpInsideListener() {\n            @Override\n            public void onTouchUpInside(UIControl control, UIEvent event) {\n                button.setTitle(\"Click #\" + (++clickCount), UIControlState.Normal);\n            }\n        });\n\n        window = new UIWindow(UIScreen.getMainScreen().getBounds());\n        window.setBackgroundColor(UIColor.lightGrayColor());\n        window.addSubview(button);\n        window.makeKeyAndVisible();\n        \n        return true;\n    }\n\n    public static void main(String[] args) {\n        NSAutoreleasePool pool = new NSAutoreleasePool();\n        UIApplication.main(args, null, IOSDemo.class);\n        pool.drain();\n    }\n}\n<\/code><\/pre>\n<p>UIWindow\u3084\u3001UIButton\u306a\u3069\u3001iOS\u30d7\u30ed\u30b0\u30e9\u30de\u306a\u3089\u304a\u99b4\u67d3\u307f\u306e\u30af\u30e9\u30b9\u304cJava\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u4e2d\u3067\u3082\u4f7f\u308f\u308c\u3066\u3044\u308b\u3053\u3068\u304c\u308f\u304b\u308a\u307e\u3059\u3002\u30dc\u30bf\u30f3\u306b\u5bfe\u3059\u308b\u3001\u30a4\u30d9\u30f3\u30c8\u30cf\u30f3\u30c9\u30e9\u306e\u767b\u9332\u306f\u3001\u30a4\u30d9\u30f3\u30c8\u30ea\u30b9\u30ca\u30fc\u3092\u4f5c\u3063\u3066\u767b\u9332\u3059\u308b\u3068\u3044\u3046Java\u30d7\u30ed\u30b0\u30e9\u30de\u304a\u99b4\u67d3\u307f\u306e\u65b9\u6cd5\u3067\u3059\u306d\u3002<\/p>\n<p>\u3053\u306eJava\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u3092Java\u30d0\u30a4\u30c8\u30b3\u30fc\u30c9\u306b\u30b3\u30f3\u30d1\u30a4\u30eb\u3002<\/p>\n<pre>\nmkdir classes\njavac -cp \/opt\/robovm\/lib\/robovm-rt.jar:\/opt\/robovm\/lib\/robovm-objc.jar:\/opt\/robovm\/lib\/robovm-cocoatouch.jar -d classes\/ IOSDemo.java\n<\/pre>\n<p>Java\u30d0\u30a4\u30c8\u30b3\u30fc\u30c9(*.class)\u3092\u30cd\u30a4\u30c6\u30a3\u30d6\u30b3\u30fc\u30c9\u306b\u30b3\u30f3\u30d1\u30a4\u30eb\u3057\u307e\u3059(\u3053\u3053\u304c\u3084\u305f\u3089\u6642\u9593\u304b\u304b\u308b)\u3002<\/p>\n<pre>\n\/opt\/robovm\/bin\/robovm -verbose -arch x86 -os ios -cp \/opt\/robovm\/lib\/robovm-objc.jar:\/opt\/robovm\/lib\/robovm-cocoatouch.jar:classes\/ -run IOSDemo\n<\/pre>\n<p>\u3057\u3070\u3089\u304f\u5f85\u3064\u3068\u3001iOS\u30b7\u30df\u30e5\u30ec\u30fc\u30bf\u30fc\u306b\u753b\u9762\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002<br \/>\n<img decoding=\"async\" src=\"https:\/\/softantenna.com\/wp\/wp-content\/uploads\/2013\/03\/2a39eb213a013f105884678ab4928972.png\" alt=\"IOS\u30b7\u30df\u30e5\u30ec\u30fc\u30bf\u306e\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2013 03 08 20 48 56\" title=\"iOS\u30b7\u30df\u30e5\u30ec\u30fc\u30bf\u306e\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2013.03.08 20.48.56.png\" border=\"0\" width=\"450\" height=\"800\" \/><\/p>\n<p>\u30af\u30ea\u30c3\u30af\u3059\u308b\u3068\u6570\u5b57\u304c\u30ab\u30a6\u30f3\u30c8\u30a2\u30c3\u30d7\u3055\u308c\u308b\u3068\u3044\u3046\u3053\u3068\u3067\u3002<\/p>\n<h3>\u307e\u3068\u3081<\/h3>\n<p>\u30b5\u30a4\u30c8\u4e0a\u306b\u300cWarning! RoboVM is pre-alpha software.\u300d\u3068\u8b66\u544a\u304c\u8868\u793a\u3055\u308c\u3066\u3044\u308b\u3053\u3068\u304b\u3089\u3082\u308f\u304b\u308b\u3088\u3046\u306b\u3001\u307e\u3060\u5b9f\u7528\u6bb5\u968e\u3067\u306f\u306a\u3044\u3068\u601d\u3044\u307e\u3059\u304c\u3001\u4eca\u5f8c\u306e\u767a\u5c55\u306b\u3088\u3063\u3066\u306f\u304a\u3082\u3057\u308d\u3044\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002\u30a4\u30d9\u30f3\u30c8\u30cf\u30f3\u30c9\u30e9\u306e\u767b\u9332\u65b9\u6cd5\u3068\u304b\u3001Java\u65b9\u5f0f\u306e\u307b\u3046\u304c\u5206\u304b\u308a\u3084\u3059\u3044\u3068\u601d\u3046\u30d7\u30ed\u30b0\u30e9\u30de\u30fc\u3082\u591a\u3044\u3067\u3057\u3087\u3046\u3002<\/p>\n<p>Java\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u306e\u30c8\u30e9\u30f3\u30b9\u30ec\u30fc\u30bf\u30fc\u3068\u3057\u3066\u306f\u3001Google\u306e\u958b\u767a\u3057\u305f\u300c<a href=\"https:\/\/code.google.com\/p\/j2objc\/\">J2ObjC<\/a>\u300d\u306a\u3093\u3066\u306e\u3082\u3042\u308b\u307f\u305f\u3044\u3067\u3059\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u300cRoboVM\u300d\u306fJava\u306e\u30d0\u30a4\u30c8\u30b3\u30fc\u30c9\u3092\u3001ARM\u307e\u305f\u306fx86\u30b3\u30fc\u30c9\u306b\u5909\u63db\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u308b\u30b3\u30f3\u30d1\u30a4\u30e9(\u30d5\u30ea\u30fc\u30bd\u30d5\u30c8\u3002GPLv2)\u3002\u3053\u308c\u3092\u4f7f\u3048\u3070Java\u8a00\u8a9e\u3092\u4f7f\u3063\u3066iOS\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u4f5c\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002 iOS\u7528\u30d7\u30ed\u30b0\u30e9\u30e0 [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":8722,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"swell_btn_cv_data":"","footnotes":""},"categories":[46,4,75],"tags":[3303,625,134],"class_list":["post-8724","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ios","category-mac","category-software","tag-ios","tag-j2objc","tag-java"],"_links":{"self":[{"href":"https:\/\/softantenna.com\/blog\/wp-json\/wp\/v2\/posts\/8724","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/softantenna.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/softantenna.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/softantenna.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/softantenna.com\/blog\/wp-json\/wp\/v2\/comments?post=8724"}],"version-history":[{"count":0,"href":"https:\/\/softantenna.com\/blog\/wp-json\/wp\/v2\/posts\/8724\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/softantenna.com\/blog\/wp-json\/wp\/v2\/media\/8722"}],"wp:attachment":[{"href":"https:\/\/softantenna.com\/blog\/wp-json\/wp\/v2\/media?parent=8724"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/softantenna.com\/blog\/wp-json\/wp\/v2\/categories?post=8724"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/softantenna.com\/blog\/wp-json\/wp\/v2\/tags?post=8724"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}