PageRenderTime 48ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/changes/apuder/jsni/doc/homepage/iphone/index.php

https://github.com/deepakworld07/xmlvm.svn
PHP | 193 lines | 188 code | 5 blank | 0 comment | 3 complexity | 49ea12e8ad1aa20813f00cd793a5ce2b MD5 | raw file
Possible License(s): Unlicense
  1. <?php<<
  2. include("../header.html");
  3. ?>
  4. <tr>
  5. <td>
  6. <div id="content_top">
  7. <a href="../toolchain">Toolchain</a> | <a href="../frontend">Frontend</a> | <a href="../clr2jvm">CLR to JVM</a> | <a href="../javascript">JavaScript</a> | <b>iPhone/Objective-C</b>
  8. </div>
  9. </td>
  10. </tr>
  11. <tr>
  12. <td id="main_content_td">
  13. <div id="main_content">
  14. <h1>Details: iPhone/Objective-C</h1>
  15. <div style="display:inline; float:right; margin: 0px 0px 5px 10px;">
  16. <object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/s8nMpi5-P-I&hl=en&fs=1&rel=0&color1=0x5d1719&color2=0xcd311b"></param><param name="allowFullScreen" value="true"></param><embed src="http://www.youtube.com/v/s8nMpi5-P-I&hl=en&fs=1&rel=0&color1=0x5d1719&color2=0xcd311b" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"></embed></object>
  17. </div>
  18. <p>
  19. Apple's iPhone has generated huge interest amongst users and developers
  20. alike. Like MacOS X, the iPhone development environment is based on
  21. Objective-C as the development language and Cocoa for the GUI
  22. library. The iPhone SDK license agreement does not permit the
  23. development of a virtual machine. Using XMLVM, we circumvent this
  24. problem by cross-compiling Java to the iPhone. Just like a Java
  25. application can be cross-compiled to <a href="../javascript">AJAX</a>, XMLVM can be
  26. used to cross-compile a Java application to Objective-C. The
  27. cross-compilation is also accomplished by mimicking a stack-based
  28. machine in Objective-C. Consider the <tt>&lt;jvm:irem&gt;</tt> instruction (<em>integer
  29. remainder</em>) that pops two integers off the stack and pushes their
  30. remainder after division back onto the stack. Using the following XSL
  31. template, the <tt>&lt;jvm:irem&gt;</tt> instruction can be mapped to Objective-C:
  32. </p>
  33. <div class="code_block">
  34. <p>
  35. <?php
  36. print_code("<xsl:template match=\"jvm:irem\">\n".
  37. " <xsl:text>\n".
  38. " _op2.i = _stack[--_sp].i; // Pop operand 1\n".
  39. " _op1.i = _stack[--_sp].i; // Pop operand 2\n".
  40. " _stack[_sp++].i = _op1.i % _op2.i; // Push remainder\n".
  41. " </xsl:text>\n".
  42. "</xsl:template>\n");
  43. ?>
  44. </p>
  45. </div>
  46. <p>
  47. Variable <tt>_stack</tt> represents the runtime stack, whereas <tt>_sp</tt>
  48. is the stack pointer that refers to
  49. the top of the stack. Pre-decrement and post-increment operations are
  50. used for popping and pushing of arguments respectively. Since the
  51. runtime stack can contain elements or arbitrary types, the declaration
  52. of helper variables <tt>_op1</tt>, <tt>_op2</tt>, and <tt>_stack[]</tt> are based on a union:
  53. </p>
  54. <div class="code_block">
  55. <p>
  56. <b>typedef union</b> {<br/>
  57. &nbsp;&nbsp;<b>id</b> o;<br/>
  58. &nbsp;&nbsp;<b>int</b> i;<br/>
  59. &nbsp;&nbsp;<b>float</b> f;<br/>
  60. &nbsp;&nbsp;<b>double</b> d;<br/>
  61. } XMLVMElem;
  62. </p>
  63. </div>
  64. <p>
  65. The following Objective-C program is the cross-compiled version of
  66. "Hello World" as explained in <a href="../frontend">XMLVM's frontend</a>:
  67. </p>
  68. <div class="code_block">
  69. <p>
  70. <?php
  71. print_code("@interface org_xmlvm_test_HelloWorld : java_lang_Object\n".
  72. "+ (void) main___java_lang_String_ARRAYTYPE :(NSMutableArray*)n1;\n".
  73. "@end\n".
  74. "\n".
  75. "@implementation org_xmlvm_test_HelloWorld;\n".
  76. "+ (void) main___java_lang_String_ARRAYTYPE :(NSMutableArray*)n1\n".
  77. "{\n".
  78. " XMLVMElem _stack[2];\n".
  79. " XMLVMElem _locals[1];\n".
  80. " int _sp = 0;\n".
  81. " XMLVMElem _op1, _op2, _op3;\n".
  82. " int _i;\n".
  83. " for (_i = 0; _i <1; _i++) _locals[_i].o = nil;\n".
  84. " NSAutoreleasePool* _pool = [[NSAutoreleasePool alloc] init];\n".
  85. " _locals[0].o = n1;\n".
  86. " _op1.o = [java_lang_System _GET_STATIC_java_lang_System_out];\n".
  87. " _stack[_sp++].o = _op1.o;\n".
  88. " _stack[_sp++].o = @\"Hello World\";\n".
  89. " _sp -= 2;\n".
  90. " [((java_io_PrintStream*) _stack[_sp].o) println___java_lang_String:_stack[_sp + 1].o];\n".
  91. " [_pool release];\n".
  92. " return;\n".
  93. "}\n".
  94. "@end\n");
  95. ?>
  96. </p>
  97. </div>
  98. <p>
  99. Since Objective-C does not support overloading of methods with
  100. identical selectors, XMLVM uses name-mangling to differentiate between
  101. different overloaded versions of a method. Apart of language-level
  102. cross-compilation, iPhone applications depend on iPhone-specific
  103. widgets. XMLVM features a prototype implementation of a Java version
  104. of the Cocoa API. The following iPhone application demonstrates a GUI
  105. version of "Hello World" in Java:
  106. </p>
  107. <div class="code_block">
  108. <p>
  109. <style>
  110. td.java, td.java-ln {vertical-align:top;}
  111. tt.java, tt.java-ln, pre.java, pre.java-ln {line-height:1em; margin-bottom:0em;}
  112. td.java-ln { text-align:right; }
  113. tt.java-ln, pre.java-ln { color:#888888 }
  114. /* Background */ span.java0 { font-size: 10pt; color:#ffffff; }
  115. /* Line numbers */ span.java1 { font-size: 10pt; color:#808080; }
  116. /* Multi-line comments */ span.java2 { font-size: 10pt; color:#3f7f5f; }
  117. /* Single-line comments */ span.java3 { font-size: 10pt; color:#3f7f5f; }
  118. /* Keywords */ span.java4 { font-size: 10pt; color:#7f0055; font-weight:bold; }
  119. /* Strings */ span.java5 { font-size: 10pt; color:green; }
  120. /* Character constants */ span.java6 { font-size: 10pt; color:#990000; }
  121. /* Numeric constants */ span.java7 { font-size: 10pt; color:#990000; }
  122. /* Parenthesis */ span.java8 { font-size: 10pt; color:#000000; }
  123. /* Primitive Types */ span.java9 { font-size: 10pt; color:#7f0055; font-weight:bold; }
  124. /* Others */ span.java10 { font-size: 10pt; color:#000000; }
  125. /* Javadoc keywords */ span.java11 { font-size: 10pt; color:#7f9fbf; }
  126. /* Javadoc HTML tags */ span.java12 { font-size: 10pt; color:#7f7f9f; }
  127. /* Javadoc links */ span.java13 { font-size: 10pt; color:#3f3fbf; }
  128. /* Javadoc others */ span.java14 { font-size: 10pt; color:#3f5fbf; }
  129. /* Undefined */ span.java15 { font-size: 10pt; color:#ff6100; }
  130. /* Annotation */ span.java16 { font-size: 10pt; color:#646464; }
  131. </style>
  132. <tt class="java"><span class="java0"><br />
  133. </span><span class="java4">public class </span><span class="java10">HelloWorld<br />
  134. &#xA0;&#xA0;&#xA0; </span><span class="java4">extends </span><span class="java10">UIApplication<br />
  135. </span><span class="java8">{<br />
  136. &#xA0;&#xA0;&#xA0; </span><span class="java4">public </span><span class="java9">void </span><span class="java10">applicationDidFinishLaunching</span><span class="java8">(</span><span class="java10">NSNotification aNotification</span><span class="java8">)<br />
  137. &#xA0;&#xA0;&#xA0; {<br />
  138. &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; </span><span class="java10">CGRect rect = UIHardware.fullScreenApplicationContentRect</span><span class="java8">()</span><span class="java10">;<br />
  139. &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; UIWindow window = </span><span class="java4">new </span><span class="java10">UIWindow</span><span class="java8">(</span><span class="java10">rect</span><span class="java8">)</span><span class="java10">;<br />
  140. &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; window.orderFront</span><span class="java8">(</span><span class="java4">this</span><span class="java8">)</span><span class="java10">;<br />
  141. &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; window.makeKey</span><span class="java8">(</span><span class="java4">this</span><span class="java8">)</span><span class="java10">;<br />
  142. &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; window._setHidden</span><span class="java8">(</span><span class="java4">false</span><span class="java8">)</span><span class="java10">;<br />
  143. &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; rect.origin.x = rect.origin.y = </span><span class="java7">0</span><span class="java10">;<br />
  144. &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; UIView mainView = </span><span class="java4">new </span><span class="java10">UIView</span><span class="java8">(</span><span class="java10">rect</span><span class="java8">)</span><span class="java10">;<br />
  145. &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; window.setContentView</span><span class="java8">(</span><span class="java10">mainView</span><span class="java8">)</span><span class="java10">;<br />
  146. &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; UITextLabel _title = </span><span class="java4">new </span><span class="java10">UITextLabel</span><span class="java8">(</span><span class="java10">rect</span><span class="java8">)</span><span class="java10">;<br />
  147. &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; _title.setText</span><span class="java8">(</span><span class="java5">&#34;Hello World!&#34;</span><span class="java8">)</span><span class="java10">;<br />
  148. &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; _title.setCentersHorizontally</span><span class="java8">(</span><span class="java4">true</span><span class="java8">)</span><span class="java10">;<br />
  149. &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; mainView.addSubview</span><span class="java8">(</span><span class="java10">_title</span><span class="java8">)</span><span class="java10">;<br />
  150. &#xA0;&#xA0;&#xA0; </span><span class="java8">}<br />
  151. <br />
  152. &#xA0;&#xA0;&#xA0; </span><span class="java4">public static </span><span class="java9">void </span><span class="java10">main</span><span class="java8">(</span><span class="java10">String</span><span class="java8">[] </span><span class="java10">args</span><span class="java8">)<br />
  153. &#xA0;&#xA0;&#xA0; {<br />
  154. &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; </span><span class="java10">UIApplication.main</span><span class="java8">(</span><span class="java10">args, HelloWorld.</span><span class="java4">class</span><span class="java8">)</span><span class="java10">;<br />
  155. &#xA0;&#xA0;&#xA0; </span><span class="java8">}<br />
  156. }</span></tt>
  157. </p>
  158. </div>
  159. <p>
  160. The Java application above can be cross-compiled to Objective-C and
  161. executed on an iPhone. The Cocoa-specific Java classes such as
  162. <tt>UIWindow</tt> and <tt>UIView</tt> are mapped to their Objective-C counter-parts.
  163. XMLVM also features a Swing-based implementation of these Cocoa
  164. classes that make it possible to run a Java-based iPhone application
  165. on a desktop. The resulting iPhone simulator is shown below as a Java
  166. applet. The accelerometer controls influence the orientation of the
  167. fireworks. On a real iPhone the sparks will follow gravity:
  168. </p>
  169. <script>
  170. function popupDemo() {
  171. newwindow=window.open("demo",'XMLVM: iPhone Demo','height=840,width=600');
  172. if (window.focus) {newwindow.focus()}
  173. return false;
  174. }
  175. </script>
  176. <p>
  177. <a href="#" onclick="popupDemo();">Click here for a demo (requires Java)</a>
  178. </p>
  179. <p>
  180. Further details on the Java for the iPhone project can be found at a
  181. <a href="http://www.youtube.com/watch?v=s8nMpi5-P-I">Google Tech Talk</a>
  182. (<a href="http://plum.sfsu.edu/xml11-external/java4iphone-google.pdf">Slides</a>).
  183. The slides also contain detailed instructions on how to compile and run the demo
  184. on a jailbroken iPhone.
  185. </p>
  186. <?php
  187. include("../footer.html");
  188. ?>