| |
| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> |
| |
| <html> |
| |
| |
| <head> |
| <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> |
| |
| <base target="_top"> |
| |
| <style type="text/css"> |
| |
| |
| /* default css */ |
| |
| table { |
| font-size: 1em; |
| line-height: inherit; |
| } |
| |
| |
| tr { |
| |
| text-align: left; |
| |
| } |
| |
| |
| div, address, ol, ul, li, option, select { |
| margin-top: 0px; |
| margin-bottom: 0px; |
| } |
| |
| p { |
| margin: 0px; |
| } |
| |
| body { |
| margin: 6px; |
| padding: 0px; |
| font-family: Verdana, sans-serif; |
| font-size: 10pt; |
| background-color: #ffffff; |
| } |
| |
| |
| img { |
| -moz-force-broken-image-icon: 1; |
| } |
| |
| @media screen { |
| html.pageview { |
| background-color: #f3f3f3 !important; |
| } |
| |
| |
| |
| body { |
| min-height: 1100px; |
| |
| counter-reset: __goog_page__; |
| } |
| * html body { |
| height: 1100px; |
| } |
| .pageview body { |
| border-top: 1px solid #ccc; |
| border-left: 1px solid #ccc; |
| border-right: 2px solid #bbb; |
| border-bottom: 2px solid #bbb; |
| width: 648px !important; |
| margin: 15px auto 25px; |
| padding: 40px 50px; |
| } |
| /* IE6 */ |
| * html { |
| overflow-y: scroll; |
| } |
| * html.pageview body { |
| overflow-x: auto; |
| } |
| /* Prevent repaint errors when scrolling in Safari. This "Star-7" css hack |
| targets Safari 3.1, but not WebKit nightlies and presumably Safari 4. |
| That's OK because this bug is fixed in WebKit nightlies/Safari 4 :-). */ |
| html*#wys_frame::before { |
| content: '\A0'; |
| position: fixed; |
| overflow: hidden; |
| width: 0; |
| height: 0; |
| top: 0; |
| left: 0; |
| } |
| |
| |
| |
| |
| .writely-callout-data { |
| display: none; |
| *display: inline-block; |
| *width: 0; |
| *height: 0; |
| *overflow: hidden; |
| } |
| .writely-footnote-marker { |
| background-image: url('MISSING'); |
| background-color: transparent; |
| background-repeat: no-repeat; |
| width: 7px; |
| overflow: hidden; |
| height: 16px; |
| vertical-align: top; |
| |
| |
| -moz-user-select: none; |
| } |
| .editor .writely-footnote-marker { |
| cursor: move; |
| } |
| .writely-footnote-marker-highlight { |
| background-position: -15px 0; |
| -moz-user-select: text; |
| } |
| .writely-footnote-hide-selection ::-moz-selection, .writely-footnote-hide-selection::-moz-selection { |
| background: transparent; |
| } |
| .writely-footnote-hide-selection ::selection, .writely-footnote-hide-selection::selection { |
| background: transparent; |
| } |
| .writely-footnote-hide-selection { |
| cursor: move; |
| } |
| |
| |
| .editor .writely-comment-yellow { |
| background-color: #FF9; |
| background-position: -240px 0; |
| } |
| .editor .writely-comment-yellow-hover { |
| background-color: #FF0; |
| background-position: -224px 0; |
| } |
| .editor .writely-comment-blue { |
| background-color: #C0D3FF; |
| background-position: -16px 0; |
| } |
| .editor .writely-comment-blue-hover { |
| background-color: #6292FE; |
| background-position: 0 0; |
| } |
| .editor .writely-comment-orange { |
| background-color: #FFDEAD; |
| background-position: -80px 0; |
| } |
| .editor .writely-comment-orange-hover { |
| background-color: #F90; |
| background-position: -64px 0; |
| } |
| .editor .writely-comment-green { |
| background-color: #99FBB3; |
| background-position: -48px 0; |
| } |
| .editor .writely-comment-green-hover { |
| background-color: #00F442; |
| background-position: -32px 0; |
| } |
| .editor .writely-comment-cyan { |
| background-color: #CFF; |
| background-position: -208px 0; |
| } |
| .editor .writely-comment-cyan-hover { |
| background-color: #0FF; |
| background-position: -192px 0; |
| } |
| .editor .writely-comment-purple { |
| background-color: #EBCCFF; |
| background-position: -144px 0; |
| } |
| .editor .writely-comment-purple-hover { |
| background-color: #90F; |
| background-position: -128px 0; |
| } |
| .editor .writely-comment-magenta { |
| background-color: #FCF; |
| background-position: -112px 0; |
| } |
| .editor .writely-comment-magenta-hover { |
| background-color: #F0F; |
| background-position: -96px 0; |
| } |
| .editor .writely-comment-red { |
| background-color: #FFCACA; |
| background-position: -176px 0; |
| } |
| .editor .writely-comment-red-hover { |
| background-color: #FF7A7A; |
| background-position: -160px 0; |
| } |
| |
| .editor .writely-comment-marker { |
| background-image: url('MISSING'); |
| background-color: transparent; |
| padding-right: 11px; |
| background-repeat: no-repeat; |
| width: 16px; |
| height: 16px; |
| -moz-user-select: none; |
| } |
| |
| .editor .writely-comment-hidden { |
| padding: 0; |
| background: none; |
| } |
| .editor .writely-comment-marker-hidden { |
| background: none; |
| padding: 0; |
| width: 0; |
| } |
| .editor .writely-comment-none { |
| opacity: .2; |
| filter:progid:DXImageTransform.Microsoft.Alpha(opacity=20); |
| -moz-opacity: .2; |
| } |
| .editor .writely-comment-none-hover { |
| opacity: .2; |
| filter:progid:DXImageTransform.Microsoft.Alpha(opacity=20); |
| -moz-opacity: .2; |
| } |
| |
| |
| |
| |
| .br_fix br:not(:-moz-last-node):not(:-moz-first-node) { |
| |
| position:relative; |
| |
| left: -1ex |
| |
| } |
| |
| .br_fix br+br { |
| position: static !important |
| } |
| } |
| |
| h6 { font-size: 8pt } |
| h5 { font-size: 8pt } |
| h4 { font-size: 10pt } |
| h3 { font-size: 12pt } |
| h2 { font-size: 14pt } |
| h1 { font-size: 18pt } |
| |
| blockquote {padding: 10px; border: 1px #DDD dashed } |
| |
| a img {border: 0} |
| |
| .pb { |
| border-width: 0; |
| page-break-after: always; |
| /* We don't want this to be resizeable, so enforce a width and height |
| using !important */ |
| height: 1px !important; |
| width: 100% !important; |
| } |
| |
| .editor .pb { |
| border-top: 1px dashed #C0C0C0; |
| border-bottom: 1px dashed #C0C0C0; |
| } |
| |
| div.google_header, div.google_footer { |
| position: relative; |
| margin-top: 1em; |
| margin-bottom: 1em; |
| } |
| |
| |
| /* Table of contents */ |
| .editor div.writely-toc { |
| background-color: #f3f3f3; |
| border: 1px solid #ccc; |
| } |
| .writely-toc > ol { |
| padding-left: 3em; |
| font-weight: bold; |
| } |
| ol.writely-toc-subheading { |
| padding-left: 1em; |
| font-weight: normal; |
| } |
| /* IE6 only */ |
| * html writely-toc ol { |
| list-style-position: inside; |
| } |
| .writely-toc-none { |
| list-style-type: none; |
| } |
| .writely-toc-decimal { |
| list-style-type: decimal; |
| } |
| .writely-toc-upper-alpha { |
| list-style-type: upper-alpha; |
| } |
| .writely-toc-lower-alpha { |
| list-style-type: lower-alpha; |
| } |
| .writely-toc-upper-roman { |
| list-style-type: upper-roman; |
| } |
| .writely-toc-lower-roman { |
| list-style-type: lower-roman; |
| } |
| .writely-toc-disc { |
| list-style-type: disc; |
| } |
| |
| /* end default css */ |
| |
| |
| /* default print css */ |
| |
| @media print { |
| body { |
| padding: 0; |
| margin: 0; |
| } |
| |
| div.google_header, div.google_footer { |
| display: block; |
| min-height: 0; |
| border: none; |
| } |
| |
| div.google_header { |
| flow: static(header); |
| } |
| |
| /* used to insert page numbers */ |
| div.google_header::before, div.google_footer::before { |
| position: absolute; |
| top: 0; |
| } |
| |
| div.google_footer { |
| flow: static(footer); |
| } |
| |
| /* always consider this element at the start of the doc */ |
| div#google_footer { |
| flow: static(footer, start); |
| } |
| |
| span.google_pagenumber { |
| content: counter(page); |
| } |
| |
| span.google_pagecount { |
| content: counter(pages); |
| } |
| |
| |
| callout.google_footnote { |
| |
| display: prince-footnote; |
| footnote-style-position: inside; |
| /* These styles keep the footnote from taking on the style of the text |
| surrounding the footnote marker. They can be overridden in the |
| document CSS. */ |
| color: #000; |
| font-family: Verdana; |
| font-size: 10.0pt; |
| font-weight: normal; |
| } |
| |
| /* Table of contents */ |
| #WritelyTableOfContents a::after { |
| content: leader('.') target-counter(attr(href), page); |
| } |
| |
| #WritelyTableOfContents a { |
| text-decoration: none; |
| color: black; |
| } |
| } |
| |
| @page { |
| @top { |
| content: flow(header); |
| } |
| @bottom { |
| content: flow(footer); |
| } |
| @footnotes { |
| border-top: solid black thin; |
| padding-top: 8pt; |
| } |
| } |
| /* end default print css */ |
| |
| |
| /* custom css */ |
| |
| |
| /* end custom css */ |
| |
| |
| |
| /* ui edited css */ |
| |
| body { |
| font-family: Verdana; |
| |
| font-size: 10.0pt; |
| line-height: normal; |
| background-color: #ffffff; |
| } |
| /* end ui edited css */ |
| |
| |
| |
| /* editor CSS */ |
| .editor a:visited {color: #551A8B} |
| .editor table.zeroBorder {border: 1px dotted gray} |
| .editor table.zeroBorder td {border: 1px dotted gray} |
| .editor table.zeroBorder th {border: 1px dotted gray} |
| |
| |
| .editor div.google_header, .editor div.google_footer { |
| border: 2px #DDDDDD dashed; |
| position: static; |
| width: 100%; |
| min-height: 2em; |
| } |
| |
| .editor .misspell {background-color: yellow} |
| |
| .editor .writely-comment { |
| font-size: 9pt; |
| line-height: 1.4; |
| padding: 1px; |
| border: 1px dashed #C0C0C0 |
| } |
| |
| |
| /* end editor CSS */ |
| |
| </style> |
| |
| </head> |
| |
| <body onload="DoPageLoad();" |
| |
| revision="cfnx2f69_111dp3jzfgb:107"> |
| |
| |
| |
| |
| <h1> |
| Using the Android Native Development Kit (NDK) |
| </h1> |
| version 1.3<br> |
| <br> |
| <h2> |
| Introduction |
| </h2> |
| The Android Native Development Kit enables developers to write shared libraries |
| in C or C++ and call them from Java code. The native shared libraries can be |
| packaged into apk files along with a normal Android application written in Java, |
| so that the resulting Android application can be downloaded and installed on an |
| Android phone.<br> |
| <br> |
| The Native Development Kit consists of:<br> |
| <ul> |
| <li> |
| C/C++ headers for native APIs<br> |
| </li> |
| <li> |
| C/C++ libraries for native APIs<br> |
| </li> |
| <li> |
| Documentation |
| </li> |
| <li> |
| Sample Code |
| </li> |
| </ul> |
| <br> |
| The Native Development Kit is designed to be used with the Android SDK:<br> |
| <ul> |
| <li> |
| The NDK is used to create a shared library containing native code. |
| </li> |
| <li> |
| The SDK is used to create an Android application written in Java that calls |
| into the native code shared library. |
| </li> |
| </ul> |
| <h1> |
| </h1> |
| <h2> |
| Setting up your machine<br> |
| </h2> |
| The Native Development Kit may be installed on either Linux or OS X. Developing |
| under Windows is not yet supported.<br> |
| <div> |
| <h3> |
| Linux Installation |
| </h3> |
| The |
| Android build is routinely tested on recent versions of Ubuntu (6.06 and later), but |
| may work on other distributions as well.<br> |
| <h4> |
| <a name=TOC-Ubuntu-Linux-i386-></a><span style=FONT-FAMILY:Verdana>Ubuntu |
| Linux (i386)</span> |
| </h4> |
| <div style=FONT-FAMILY:Verdana> |
| To set up your Linux development environment, make sure you have the |
| following:<span style="WORD-SPACING:0px; FONT-STYLE:normal; FONT-VARIANT:normal; FONT-WEIGHT:normal; font-size-adjust:none; font-stretch:normal; TEXT-TRANSFORM:none; COLOR:#000000; WHITE-SPACE:normal; LETTER-SPACING:normal; border-collapse:separate"><font size=2> |
| </font></span> |
| </div> |
| <div style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px; FONT-FAMILY:Verdana"> |
| <div style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"> |
| <div style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"> |
| <ul style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"> |
| <li style="MARGIN-TOP:8px; MARGIN-BOTTOM:8px"> |
| Git 1.5.4 or |
| newer<span style="FONT-WEIGHT:normal; WORD-SPACING:0px; TEXT-TRANSFORM:none; COLOR:#000000; FONT-STYLE:normal; WHITE-SPACE:normal; LETTER-SPACING:normal; border-collapse:separate; FONT-VARIANT:normal"><font size=2>. </font></span> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| <blockquote style="BORDER:medium none ; MARGIN:0pt 0pt 0pt 40px; PADDING:0px"> |
| <span style=FONT-FAMILY:arial><span style="FONT-WEIGHT:normal; WORD-SPACING:0px; TEXT-TRANSFORM:none; COLOR:#000000; FONT-STYLE:normal; WHITE-SPACE:normal; LETTER-SPACING:normal; border-collapse:separate; FONT-VARIANT:normal"><span style="FONT-FAMILY:courier new,monospace">$ |
| </span></span><span style="FONT-FAMILY:courier new,monospace">sudo apt-get |
| install git-core<br> |
| </span></span> |
| </blockquote> |
| <div> |
| <div style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"> |
| <div style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px; FONT-FAMILY:arial,sans-serif"> |
| <div style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px"> |
| <h4> |
| <a name=TOC-Ubuntu-Linux-amd64-></a><span style=FONT-FAMILY:Verdana>Ubuntu |
| Linux (amd64)</span> |
| </h4> |
| <span style=FONT-FAMILY:Verdana>This has not been as well |
| tested.</span> |
| </div> |
| <div style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px; FONT-FAMILY:Verdana"> |
| <br> |
| </div> |
| <div style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px; FONT-FAMILY:Verdana"> |
| The Android build requires a 32-bit build environment: |
| </div> |
| <div style="MARGIN-TOP:0px; MARGIN-BOTTOM:0px; FONT-FAMILY:Verdana"> |
| <ul> |
| <li> |
| Get the packages as listed above in the i386 |
| instructions:<span style="FONT-WEIGHT:normal; WORD-SPACING:0px; TEXT-TRANSFORM:none; COLOR:#000000; FONT-STYLE:normal; WHITE-SPACE:normal; LETTER-SPACING:normal; border-collapse:separate; FONT-VARIANT:normal"> </span> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| </div> |
| <blockquote style="BORDER:medium none ; MARGIN:0pt 0pt 0pt 40px; PADDING:0px"> |
| <span style=FONT-FAMILY:arial><span style="FONT-WEIGHT:normal; WORD-SPACING:0px; TEXT-TRANSFORM:none; COLOR:#000000; FONT-STYLE:normal; WHITE-SPACE:normal; LETTER-SPACING:normal; border-collapse:separate; FONT-VARIANT:normal"><span style="FONT-FAMILY:courier new,monospace">$ </span></span><span style="FONT-FAMILY:courier new,monospace">sudo |
| apt-get install git-core<br> |
| </span></span> |
| </blockquote> |
| <h4> |
| <a name=TOC-Other-Linux></a>Other Linux |
| </h4> |
| <p> |
| There's |
| no reason why Android cannot be built on non-Ubuntu systems<span style=FONT-WEIGHT:normal><font size=2>. In general you will need:</font></span> |
| </p> |
| <ul> |
| <li> |
| Git 1.5.4 or newer. You can find it at <a href=http://git.or.cz/ rel=nofollow>http://git.or.cz/</a><span style=FONT-FAMILY:arial></span> |
| </li> |
| </ul> |
| <div> |
| <h3> |
| Mac OS Installation |
| </h3> |
| <ul> |
| <li> |
| <span style=FONT-FAMILY:arial,sans-serif>To build the Android files in a |
| Mac OS environment, you need an Intel/x86 machine. The Android build |
| system and tools do not support the older PowerPC architecture.</span> |
| </li> |
| <li> |
| <span style=FONT-FAMILY:arial,sans-serif>Android must be built on a |
| case-sensitive file system.<br> |
| </span> |
| </li> |
| <ul> |
| <li> |
| We recommend that you build Android on a partition that has been |
| formatted with the "Case-sensitive Journaled HFS+" file system: |
| </li> |
| <ul> |
| <li> |
| A case-sensitive file system is required because the sources contain |
| files that differ only in case. |
| </li> |
| <li> |
| Journaled systems are more robust. (This is optional, but |
| recommended.) |
| </li> |
| <li> |
| HFS+ is required to successfully build Mac OS applications such as |
| the Android Emulator for OS X. |
| </li> |
| </ul> |
| <li> |
| If you want to avoid partitioning/formatting your hard drive, you can |
| use a case-sensitive disk image instead. |
| </li> |
| <ul> |
| <li> |
| To create the image:<br> |
| <ul> |
| <li> |
| launch /Applications/Utilities/Disk Utility |
| </li> |
| <li> |
| select "New Image" |
| </li> |
| <li> |
| size: 8 GB (this will work, but you can choose more if you want |
| to) |
| </li> |
| <li> |
| volume format: case sensitive, journaled |
| </li> |
| </ul> |
| </li> |
| <li> |
| This will create a .dmg file which, once mounted, acts as a drive |
| with the required formatting for Android development. For a disk |
| image named "android.dmg" stored in your home directory, you can add |
| the following to your ~/.bash_profile to mount the image when you |
| execute "mountAndroid":<br> |
| <br> |
| <div style=MARGIN-LEFT:40px> |
| <span style="FONT-FAMILY:courier new,monospace"># command to mount |
| the android file |
| image</span><br style="FONT-FAMILY:courier new,monospace"> |
| <span style="FONT-FAMILY:courier new,monospace">function |
| mountAndroid { hdiutil attach ~/android.dmg |
| -mountpoint /Volumes/android; }</span><br> |
| </div> |
| <br> |
| Once mounted, you'll do all your work in the "android" volume. You |
| can eject it (unmount it) just like you would with an external |
| drive. |
| </li> |
| </ul> |
| </ul> |
| </ul> |
| <div> |
| <br> |
| <ul> |
| <li> |
| Install git 1.5.4 or newer. You can find it at |
| <a href=http://git.or.cz/ rel=nofollow>http://git.or.cz/</a> |
| </li> |
| </ul> |
| <h2> |
| Installing the Android SDK |
| </h2> |
| The Android NDK uses the Android SDK. You can find the Android SDK at |
| <a href=http://code.google.com/android/download.html id=a.-o title=http://code.google.com/android/download.html>http://code.google.com/android/download.html</a><br> |
| This version of the Android NDK requires the Cupcake version of the |
| Android SDK.<br> |
| <br> |
| <h2> |
| Installing the Prebuilt Native Toolchain<br> |
| </h2> |
| The NDK uses the prebuilt native toolchain from the Android Open Source |
| git repository.<br> |
| <br> |
| To download the prebuilt native toolchain to your working directory, |
| execute the following commands:<br> |
| <br> |
| <span style="FONT-FAMILY:Courier New"></span> |
| <div style=MARGIN-LEFT:40px> |
| <span style="FONT-FAMILY:Courier New">git clone |
| git://android.git.kernel.org/platform/prebuilt.git</span><br> |
| <span style="FONT-FAMILY:Courier New">cd prebuilt</span><br> |
| <span style="FONT-FAMILY:Courier New">git checkout -b cupcake -t |
| origin/cupcake</span><br> |
| </div> |
| <div style=MARGIN-LEFT:40px> |
| <span style="FONT-FAMILY:Courier New"></span> |
| </div> |
| <br> |
| <h2> |
| Setting Environment Variables |
| </h2> |
| The NDK requires that you set two environment variables:<br> |
| <ul> |
| <li> |
| PREBUILT must be set to the directory that contains the prebuilt |
| toolchain. Include the "prebuilt" directory in the path. Example: |
| /Volumes/android/prebuilt<br> |
| </li> |
| <li> |
| ANDROID_SDK_BASE must be set to the directory that contains the |
| Android SDK. Example: ~/AndroidSDK<br> |
| </li> |
| </ul> |
| <br> |
| <h2> |
| <span style=FONT-FAMILY:Verdana>Unpacking the NDK</span> |
| </h2> |
| Unpack the android_pndk.tar.gz into your working directory<br> |
| <br> |
| <div style=MARGIN-LEFT:40px> |
| <span style="FONT-FAMILY:Courier New">tar -zxvf |
| android_pndk.tar.gz</span><br> |
| </div> |
| <br> |
| This will create a directory called pndk. It should contain a README.html |
| file (this file) and the following directories: config, include, lib, and |
| sample.<br> |
| <br> |
| Look in the "samples" directory for samples showing how to use the NDK.<br> |
| <br> |
| <br> |
| </div> |
| <br> |
| </div> |
| <br> |
| </div> |
| <br></body> |
| </html> |