<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7435258304396242206</id><updated>2012-02-16T08:11:57.154Z</updated><category term='Android jni ndk eclipse getting started'/><category term='mobile'/><category term='iPhone XCode Mixtikl'/><category term='Visual Studio'/><category term='bonjour iphone mac mixtikl'/><category term='minimixa sypc mashup mobile mixing'/><category term='iPhone JavaScript JavaScriptCore'/><category term='Palm'/><category term='in-app advertising'/><category term='ndk'/><category term='cygwin shell mintty rxvt'/><category term='jni'/><category term='iphone'/><category term='iPhone XCode'/><category term='iPod'/><category term='sis'/><category term='Antix'/><category term='android audio ndk low latency opensl es'/><category term='Mixtikl iPhone'/><category term='windows mobile'/><category term='mixtikl noatikl 64-bit windows mac'/><category term='iphone ad-hoc version upgrade xcode compress &quot;disk utility&quot;'/><category term='android obfuscate'/><category term='Linux gcc nm mangling mangled'/><category term='Android ListView owner-draw lists java generics'/><category term='Parallels Windows XP Mac OS Visual Studio Open Office Firefox Spaces'/><category term='iPhone UIAlertView UIAlertViewDelegate modal'/><category term='virtualbox vmware parallels'/><category term='mixtikl clipboard intua'/><category term='find xargs unix linux mac terminal cygwin bash'/><category term='android jni npapi thread callback'/><category term='iPhone XCode Cocoa'/><category term='vim MRU'/><category term='diff'/><category term='webOS'/><category term='XCode'/><category term='mixtikl V2 launch'/><category term='android jni ndk stl stlport'/><category term='Boot Camp'/><category term='android percentage layout'/><category term='mixtikl android'/><category term='Visual Lint'/><category term='mixtikl android symbian'/><category term='MeeGo cygwin'/><category term='android gdb'/><category term='airplay sdk'/><category term='macvim xcode vim'/><category term='android ndk C++ native jni'/><category term='vim gvim viemu macvim'/><category term='android ndk eclipse gdb'/><category term='CGContextSelectFont CGContextSetFontSize iPhone'/><category term='android sdk stl rtti c++ exceptions jni'/><category term='iphone windows mobile android symbian smartphones applications'/><category term='iPhone Objective-C Objective-++ Cocoa Bonjour'/><category term='iPhone Objective-C Objective-++ Cocoa'/><category term='iphone mixtikl'/><category term='Antix Game Player'/><category term='mixtikl android jni ndk c++ port'/><category term='android native gdb debugging'/><category term='PackageBuilder'/><category term='iPhone XCode provisioning profile'/><category term='Mixtikl Qt C++ porting iPhone'/><category term='C++ auto_ptr arrays'/><category term='vim macvim objcpp objective-c objective-c++ syntax highlighting'/><category term='GTK'/><category term='C++'/><category term='iPhone Mixtikl Tiklpaks Partikl'/><category term='Noatikl'/><category term='android audio sdk'/><category term='Beyond Compare'/><category term='Mac diff'/><category term='CFSocketCreate iPhone ipv6 ipv4'/><category term='gcc optimization performance tuning example'/><category term='cppcheck'/><category term='Mixtikl miniMIXA'/><category term='iPhone performSelectorOnMainThread'/><category term='android pdk sdk service'/><category term='git sourcetree'/><category term='Android'/><category term='stl'/><category term='Windows 7'/><category term='android qt sdl airplay'/><category term='Changes'/><category term='android popup menu'/><category term='apk'/><category term='android iphone windows mobile C++ C# Java symbian'/><category term='cabwiz'/><category term='iPhone Mixtikl Liptikl'/><category term='getting started'/><category term='Symbian'/><category term='airplay'/><category term='EnumWindows'/><category term='Inno Setup'/><category term='Mixtikl'/><category term='PC-Lint'/><category term='mixtikl v2'/><category term='Mixtikl Bonjour Windows iPhone'/><title type='text'>Pete Cole from Intermorphic</title><subtitle type='html'>Thoughts from the programmer behind Intermorphic (Liptikl, Noatikl, Mixtikl, the Intermorphic Sound System), and SSEYO (miniMIXA and the Koan music engine)</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default?start-index=101&amp;max-results=100'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>109</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-1985238318322330810</id><published>2012-01-23T16:16:00.000Z</published><updated>2012-01-23T16:16:35.565Z</updated><title type='text'>Noatikl 2</title><content type='html'>We've been working very hard on Noatikl 2, and it is going to be a huge improvement on Noatikl 1.x!&lt;br /&gt;&lt;br /&gt;Noatikl 2 will include built-in support for the Partikl synth that has already been featured in Mixtikl (in addition to all of Noatikl's traditional MIDI I/O options).&lt;br /&gt;&lt;br /&gt;When Noatikl 2 launches later this year, it will be available directly from the Mac App Store in standalone form (Windows versions and Mac Plug-in variants will be on the Intermorphic web store as usual). We're also planning to bring it to both iOS and Android at some point this year. :)&lt;br /&gt;&lt;br /&gt;Pete&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-1985238318322330810?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/1985238318322330810/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=1985238318322330810' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/1985238318322330810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/1985238318322330810'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2012/01/noatikl-2.html' title='Noatikl 2'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-291330509349529363</id><published>2011-12-24T16:34:00.000Z</published><updated>2011-12-24T16:34:14.803Z</updated><title type='text'>Mixtikl on Kindle Fire!</title><content type='html'>I got hold of a Kindle Fire via a re-seller on eBay UK, so we could make sure that Mixtikl worked fine on there.&lt;br /&gt;&lt;br /&gt;This being Android, Mixtikl worked first time! I installed Mixtikl using "adb install", having first configured adb to recognise the Kindle Fire. &lt;br /&gt;&lt;br /&gt;I changed just a couple of things to make it "Kindle Fire friendly". Those being:&lt;br /&gt;- I had to increase the audio latency a bit to prevent audio break-up; that took just a few minutes...&lt;br /&gt;- I had to account for Kindle Fire's taking-up the bottom 20 pixels to display the soft menu bar, which was also very easy...&lt;br /&gt;&lt;br /&gt;I must say that Mixtikl works *really* well on the Kindle Fire. The Mixtikl icon doesn't display at the moment; but I have read that is because the icon is downloaded only when you purchase the app from the Amazon Kindle App Store.&lt;br /&gt;&lt;br /&gt;I should  say that I'm really very impressed with the Kindle Fire! It is a really nice size, fabulous for reading books (thanks to the touch screen, which isn't on the older Kindle of course). It seems very fast, with a lovely clear display and it is very responsive. Will I like it more than my iPad 1? Well, I prefer the size of the Kindle Fire, and like the stereo speakers; and I like that it was so easy to get our app running on it. :) The iPad has the advantage of having lots of good quality games for it... but it is *very* much more expensive ... if the Kindle Fire had more storage space, it'd make quite a nice MP3 player.&lt;br /&gt;&lt;br /&gt;It's a pain that the Amazon App store is US-only at the moment, but I'm sure they'll roll that out worldwide soon enough. I think they're going to sell huge numbers of Kindle Fires!&lt;br /&gt;&lt;br /&gt;I also want to mention that so far, the Amazon developer support team have been *incredibly* responsive to the questions I've had; I'm genuinely impressed!&lt;br /&gt;&lt;br /&gt;Pete&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-291330509349529363?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/291330509349529363/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=291330509349529363' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/291330509349529363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/291330509349529363'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2011/12/mixtikl-on-kindle-fire.html' title='Mixtikl on Kindle Fire!'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-7465790917423075909</id><published>2011-12-19T09:16:00.002Z</published><updated>2011-12-20T21:44:21.004Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='mixtikl android jni ndk c++ port'/><title type='text'>Mixtikl on Android - reprise</title><content type='html'>The port of &lt;a href="http://www.intermorphic.com/tools/mixtikl/index.html"&gt;Mixtikl&lt;/a&gt; to Android is now complete.&lt;br /&gt;&lt;br /&gt;I thought I'd share how I ended-up porting Mixtikl to Android, as this has been a long road!&lt;br /&gt;&lt;br /&gt;When I first started looking at porting Mixtikl to Android, there were a couple of blocking issues;&lt;br /&gt;- no support for C++ template library (though eventually STLPort arrived!)&lt;br /&gt;- the original Mixtikl made heavy use of Modal code for dialog handling&lt;br /&gt;Both of those two items made a port with Android a non-starter.&lt;br /&gt;&lt;br /&gt;However, when Airplay (now renamed to Marmalade) added Android support, we were able to attempt a port of Mixtikl; as Airplay contained both C++ template library support, and supported modal code.&lt;br /&gt;Ultimately however, the audio had too many problems (very, very high latency, mono only etc.) and this made the Airplay-based port too low quality to allow us to release.&lt;br /&gt;&lt;br /&gt;Time moves on however, and a while back, Google added full support for the C++ standard template library to the Android NDK. And, critically, they added support for both OpenSL (to Android 2.3), and 32-bit ARM code generation (via armeabi-v7a). Given those changes, we spend a month or so removing all the modal code from Mixtikl (not an easy undertaking: you have to bear in mind that Mixtikl is &amp;gt; 500K lines of C++ code!).&lt;br /&gt;&lt;br /&gt;So, given those changes in both the Android NDK and Mixtikl's own internal architecture, we were able to start and complete a full native port of Mixtikl to Android. &lt;br /&gt;&lt;br /&gt;The bulk of Mixtikl remains in C++; all the graphics are drawn via the same C++-based graphics engine we use on all platforms. The interaction with Java is just a thin JNI layer that looks after drawing primitives and some native dialog interfacing. The OpenSL support is just a thin adaptor layer between our audio engine and OpenSL.&lt;br /&gt;&lt;br /&gt;Mixtikl performs brilliantly on Android in my opinion; though as noted elsewhere the Android OpenSL implementation is missing a big trick in regards latency management; and we have to configure Mixtikl to run with slightly higher latency that we would like in order to avoid any potential audio break-up.&lt;br /&gt;&lt;br /&gt;I should note that debugging C++ code on Android remains a pain, you have to rely on trace statements, though it is at least possible now to use gdb and the bt command to trap crashes when they happen and see where the code died in the call stack.&amp;nbsp; The good news is that Mixtikl is very solid as 99% of the code is cross-platform and very well tested, so I've hardly had to touch gdb!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-7465790917423075909?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/7465790917423075909/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=7465790917423075909' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/7465790917423075909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/7465790917423075909'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2011/12/mixtikl-on-android-reprise.html' title='Mixtikl on Android - reprise'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-1167435561177570445</id><published>2011-12-06T09:26:00.000Z</published><updated>2011-12-06T09:26:48.295Z</updated><title type='text'>Android - how to reduce the audio latency</title><content type='html'>I been approached a few times recently about how to write low-latency audio latency apps in Android, and I point such queries to OpenSL and say "look how much better it is that it used to be" (provided you use C++ of course)...&lt;br /&gt;&lt;br /&gt;But the bottom line is that the Android audio APIs - and that includes OpenSL - still miss the basic trick, which is to be able to offer a programmatic contract that is as simple as this:&lt;br /&gt;&lt;br /&gt;App : what sets of audio rates and formats do you support?&lt;br /&gt;(API responds, maybe only 22Khz stereo, for sake of simplicity here)&lt;br /&gt;App asks: how&amp;nbsp; many audio blocks do I need to keep prepared and primed in the queue to guarantee no break-up, at this rate/format, with minimal latency?&lt;br /&gt;(API responds, maybe 2 blocks of 512 sample frames each).&lt;br /&gt;App prepares the first 2 blocks, submits, and gets "block delivery" callbacks; it runs a separate thread to keep internal queues topped-up ready to deliver to the callbacks.&lt;br /&gt;&lt;br /&gt;With that sort of contract, every app can run at minimal latency dictated by the underlying audio device (through the driver layer), on any device.&amp;nbsp; Without that sort of contract, every app developer is kept guessing, and has to assume a worst case that works on all devices available for testing. :)&lt;br /&gt;&lt;br /&gt;I implemented this scheme nearly a decade ago in the intent Sound System (I had the luxury of designing and implementing a complete audio architecture for mobile devices from scratch!). It is a piece of cake to do, and IMO audio developers for Android are screaming for it. Intent was focused on ultra-low audio latency for games / multimedia and musical instruments...&lt;br /&gt;&lt;br /&gt;I should note, Apple have also missed the same trick - they've been able to get away with it however, as the offer a fixed range of hardware....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-1167435561177570445?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/1167435561177570445/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=1167435561177570445' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/1167435561177570445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/1167435561177570445'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2011/12/android-how-to-reduce-audio-latency.html' title='Android - how to reduce the audio latency'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-3027403719785252942</id><published>2011-12-04T00:36:00.004Z</published><updated>2011-12-05T22:24:22.236Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='android audio ndk low latency opensl es'/><title type='text'>Android - high performance audio - how to do it</title><content type='html'>I've just been through a very interesting period of work, sorting-out a high-performance audio interface for the Android port of Mixtikl. I've learned quite a few things - here are the highlights.&lt;br /&gt;&lt;br /&gt;Firstly, target Android 2.3 or later. This allows you to use OpenSL ES, which is the only realistic approach for low-latency audio on Android. The audio allows you to delivery audio with pretty low latency, and totally avoids any problems of garbage collection blocking you. This of course assumes that all your audio code is written in C++!&lt;br /&gt;&lt;br /&gt;As you're using OpenSL ES, and assuming you have some very heavy audio DSP going-on (like in Mixtikl!), you'll need to use a separate Posix thread to keep your audio callbacks pumped-up. Basically, if your OpenSL ES audio block callbacks take much time at all, then your audio will break-up. So, use a worker thread to keep sufficient audio pre-processed and ready to be picked-up and delivered via your callbacks!&lt;br /&gt;&lt;br /&gt;Finally, and believe me this is important (!): make sure you target armeabi-v7a, and that you use the right compiler flags to generate 32-bit ARM7 code. If you on the other hand use the default settings, you'll generate Thumb code for armeabi - and your code will run staggeringly slower&amp;nbsp; (!!), and audio break-up is inevitable if you're doing anything serious. So: don't bother targeting armeabi devices... and Thumb code is a no-no.&lt;br /&gt;&lt;br /&gt;Follow my advice, and you can create sophisticated audio software. Don't follow it, and you're going to find things tough! ;)&lt;br /&gt;&lt;br /&gt;I should note that support for&amp;nbsp; armeabi-v7a *emulator* targets arrived in the Android 4.0 SDK... which makes things a lot easier as well... something worth knowing!&lt;br /&gt;&lt;br /&gt;Finally... here is a useful resource on the background to OpenSL ES on Android...:&lt;br /&gt;&lt;a href="http://mobilepearls.com/labs/native-android-api/opensles/index.html"&gt;http://mobilepearls.com/labs/native-android-api/opensles/index.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-3027403719785252942?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/3027403719785252942/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=3027403719785252942' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/3027403719785252942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/3027403719785252942'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2011/12/android-high-performance-audio-how-to.html' title='Android - high performance audio - how to do it'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-5288855668678044935</id><published>2011-10-21T14:26:00.002+01:00</published><updated>2011-10-24T09:21:09.737+01:00</updated><title type='text'>gdb with the Android NDK - now easy with ddd wrapping ndk-gdb!</title><content type='html'>&lt;span style="font-family: inherit;"&gt;You might already know this, but android debugging from gdb is now really, really easy - if you can stomach gdb!&lt;br /&gt;&lt;br /&gt;See Android/ndk6/docs/NDK-GDB.html in your NDK documentation.&lt;br /&gt;&lt;br /&gt;Basically, the app's libs/armeabi folder must have a gdbserver in it... which is put there automatically by the ndk-build command (remember not to ship your app with gdbserver in it!):&lt;br /&gt;&lt;br /&gt;So...: build your app, install with e.g.:&lt;br /&gt;&lt;br /&gt;adb install -r myfile.apk&lt;br /&gt;&lt;br /&gt;Start your app directly from the Android UI, and in a terminal, change to your product's jni folder, and you're ready to debug!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;b&gt;&lt;u&gt;Using command-line gdb&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;If you prefer command-line gdb, type this:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ndk-gdb com.example.myproject&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;You'll find that ndk-gdb will break as your app attaches. Set a breakpoint if you want (optional!), e.g.:&lt;br /&gt;&lt;br /&gt;b Java_com_example_hellojni_HelloJni_stringFromJNI&lt;br /&gt;&lt;br /&gt;Enter "cont" to continue...&lt;br /&gt;&lt;br /&gt;And the debugger will now hit your breakpoints - use normal gdb commands to control it!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;b&gt;&lt;u&gt;Using the graphical ddd debugger&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;If, like me, you prefer to use a graphical debugger, it is really easy to use ddd as a wrapper around gdb!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;Many thanks to a blog reader for this suggestion!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;It is really easy to use ddd instead... here are the steps!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;u&gt;&lt;span style="font-family: inherit;"&gt;Preparation:&lt;/span&gt;&lt;/u&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;1. Install ddd ...!&lt;br /&gt;2. Modify your ndk-gdb shells script, to simply comment-out the "exit 1" call when an unexpected argument is passed&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;u&gt;Running ddd&amp;nbsp;&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;Start your app from Eclipse&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;In a terminal window, change to your project's jni folder (if you're not there already!)&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;Run ddd like this - and that is all there is to it!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;b&gt;ddd --debugger ndk-gdb&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;&lt;span style="font-family: inherit;"&gt;Eclipse&lt;/span&gt;&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;Using gdb for JNI/NDK from Eclipse is way too painful - I wouldn't bother. :)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;&lt;span style="font-family: inherit;"&gt;Run-time breakpoints&lt;/span&gt;&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;On a final note, you can use this code to force a breakpoint at runtime...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #define BREAKPOINT __asm__ ("bkpt 0")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf ("Hitting breakpoint!");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BREAKPOINT;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf ("Gone past breakpoint!");&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-5288855668678044935?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/5288855668678044935/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=5288855668678044935' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/5288855668678044935'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/5288855668678044935'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2011/10/gdb-with-android-ndk-now-easy.html' title='gdb with the Android NDK - now easy with ddd wrapping ndk-gdb!'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-8823978402088558260</id><published>2011-09-23T08:20:00.000+01:00</published><updated>2011-09-23T08:20:40.138+01:00</updated><title type='text'>Mixtikl 5... iOS/Mac/Windows</title><content type='html'>Work on Mixtikl 5 is keeping me very busy... we've decided that Mixtikl 5 will be the first version we release for Android. However, we'll focus first on finishing-off the iOS / Mac /Windows versions...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-8823978402088558260?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/8823978402088558260/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=8823978402088558260' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/8823978402088558260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/8823978402088558260'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2011/09/mixtikl-5-iosmacwindows.html' title='Mixtikl 5... iOS/Mac/Windows'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-257790641051904315</id><published>2011-09-02T10:08:00.001+01:00</published><updated>2011-09-02T10:09:09.967+01:00</updated><title type='text'>Android - using findbugs from outside of Eclipse</title><content type='html'>I've been using findbugs to help track-down issues in Java code.&amp;nbsp; A great tool, and very easy to use. However, the Eclipse-based plug-in keeps crashing for me with a NullPointerException on certain projects.&lt;br /&gt;&lt;br /&gt;The work-around to this is to run the findbugs UI directly.&lt;br /&gt;&lt;br /&gt;To use findbugs on Windows, get the latest findbugs distribution from &lt;a href="http://findbugs.sourceforge.net/downloads.html"&gt;http://findbugs.sourceforge.net/downloads.html&lt;/a&gt;, and then create a shortcut along the following lines (note the -X argument, as the JVM might require quite a bit of memory to avoid failing for big projects!):&lt;br /&gt;&lt;blockquote&gt;&lt;myjavabinfolder&gt;\java.exe -Xmx1024m -jar C:\findbugs-1.3.9\lib\findbugs.jar -gui&lt;/myjavabinfolder&gt;&lt;/blockquote&gt;&lt;br /&gt;On Mac, simply run something like this directly:&lt;br /&gt;&lt;blockquote&gt;java -Xmx1024m -jar ~/findbugs-1.3.9/lib/findbugs.jar -gui &amp;amp;&lt;/blockquote&gt;&lt;br /&gt;It is really use to use - just select File -&amp;gt; New Project, add your class folders to the top pane, your source folders to the bottom pane, and let it run!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-257790641051904315?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/257790641051904315/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=257790641051904315' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/257790641051904315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/257790641051904315'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2011/09/android-using-findbugs-from-outside-of.html' title='Android - using findbugs from outside of Eclipse'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-6403473573092483524</id><published>2011-08-30T09:05:00.000+01:00</published><updated>2011-08-30T09:05:16.721+01:00</updated><title type='text'>Upgrade to XCode 4.1 - problems with VALID_ARCHS for iOS Simulator builds</title><content type='html'>Now that I've taken the plunge and moved to XCode 4.x from XCode 3.x ... I had a really weird problem trying to build my iOS projects for the simulator.&lt;br /&gt;&lt;br /&gt;The builds failed with an error related to the i386 architecture. I simply couldn't figure-out how to solve this directly with the XCode IDE.&lt;br /&gt;&lt;br /&gt;Luckily, I did manage to figure-out a fix: my solution was to edit the project.pbxproj files by hand with vim, and remove a handul of fixed definitions of &lt;span id="thread_subject_site"&gt;VALID_ARCHS ... which presumably were legacies from previous XCode versions. This is not the first time that I've been forced to fix XCode projects by hand!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-6403473573092483524?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/6403473573092483524/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=6403473573092483524' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/6403473573092483524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/6403473573092483524'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2011/08/upgrade-to-xcode-41-problems-with.html' title='Upgrade to XCode 4.1 - problems with VALID_ARCHS for iOS Simulator builds'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-2217890690666041544</id><published>2011-08-29T13:43:00.001+01:00</published><updated>2011-08-29T13:44:06.193+01:00</updated><title type='text'>Mac - how to build installs the easy way</title><content type='html'>I was having some issues getting my Mac installers (using packagemaker) working with the latest XCode.&lt;br /&gt;&lt;br /&gt;Surfing-around, I found an amazing free tool called Packages. The link is here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://s.sudre.free.fr/Software/Packages/about.html"&gt;http://s.sudre.free.fr/Software/Packages/about.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've changed our own installers to use this, and all my Mac install problems have disappeared with an hours work. :)&lt;br /&gt;&lt;br /&gt;Pete&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-2217890690666041544?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/2217890690666041544/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=2217890690666041544' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/2217890690666041544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/2217890690666041544'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2011/08/mac-how-to-build-installs-easy-way.html' title='Mac - how to build installs the easy way'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-163501809364232529</id><published>2011-08-10T09:15:00.001+01:00</published><updated>2011-08-10T09:15:47.518+01:00</updated><title type='text'>Audio and MIDI Visualization in iOS and Android</title><content type='html'>I've spent the past month focused mainly on Intermorphic's Audio/MIDI visualizer framework, dusting-down the work I did (in the main) several years ago, and bringing it all up-to-date.&lt;br /&gt;&lt;br /&gt;I've recently experimented with lots of stuff, 2D and 3D, on iOS (UIKit ,Quartz, Core Animation and OpenGL ES) and Android (Canvas and OpenGL ES), and have learned a lot about performance differences between these approaches. I've also learned that OpenGL ES is a truly horrible API in which to get things done. :)&lt;br /&gt;&lt;br /&gt;Anyways - things are coming on nicely: the next update for Mixtikl should be another good one!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-163501809364232529?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/163501809364232529/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=163501809364232529' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/163501809364232529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/163501809364232529'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2011/08/audio-and-midi-visualisation-in-ios-and.html' title='Audio and MIDI Visualization in iOS and Android'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-5867737436634474977</id><published>2011-08-03T11:53:00.000+01:00</published><updated>2011-08-03T11:53:25.565+01:00</updated><title type='text'>Android - turn key events into UTF8</title><content type='html'>As I've been asked a few times how to turn Android key events into UTF8 data, I figured it might be a good idea to share this info in my blog! It is actually really easy:&lt;br /&gt;&lt;br /&gt;&amp;nbsp; @Override&lt;br /&gt;&amp;nbsp; public boolean onKeyDown(int keyCode, KeyEvent event) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int [] unicodePoints = new int[1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; unicodePoints[0] = event.getUnicodeChar();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; String x = new String(unicodePoints, 0, 1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; byte utf8Bytes[];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; utf8Bytes = x.getBytes("UTF-8");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Do something with your UTF-8 data here!&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ....&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (UnsupportedEncodingException e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Log.e(TAG, "Failed to key event to UTF8");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Throw(e);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return true;&lt;br /&gt;&amp;nbsp; }&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-5867737436634474977?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/5867737436634474977/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=5867737436634474977' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/5867737436634474977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/5867737436634474977'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2011/08/android-turn-key-events-into-utf8.html' title='Android - turn key events into UTF8'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-4622691609220554693</id><published>2011-07-26T20:29:00.000+01:00</published><updated>2011-07-26T20:29:00.895+01:00</updated><title type='text'>Mixtikl on Android - with the NDK and C++</title><content type='html'>Mixtikl is now around 95% complete on Android.&lt;br /&gt;&lt;br /&gt;I've actually ported directly with the NDK/C++, without using Juce, as my 2d portability layer for Mixtikl is so highly developed. The port only took around a week (having already done a lot of background work in the previous few months laying the ground for this and possibly other ports!).&lt;br /&gt;&lt;br /&gt;The Audio drivers have caused some fun; I've ended-up implementing support for AudioTrack and AudioRecord in native code with pthreads. Audio support in Android really is very poor...&lt;br /&gt;&lt;br /&gt;The biggest headache is the basic problem of debugging C++ code on Android; I'm reduced to using trace statements. It helps that 99% of the code in Mixtikl is cross-platform and fully debugged on other platforms!&lt;br /&gt;&lt;br /&gt;That said, the latest NDK (R6) is much improved with STL support and what have you; there is no longer any need to use Crystax.&lt;br /&gt;&lt;br /&gt;I'm still very likely to use Juce for the Liptikl and Noatikl ports to Android, of course!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-4622691609220554693?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/4622691609220554693/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=4622691609220554693' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/4622691609220554693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/4622691609220554693'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2011/07/mixtikl-on-android-with-ndk-and-c.html' title='Mixtikl on Android - with the NDK and C++'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-9091260663557633893</id><published>2011-06-30T08:37:00.000+01:00</published><updated>2011-06-30T08:37:36.159+01:00</updated><title type='text'>Juce, C++ and Android</title><content type='html'>I've been experimenting with using the fabulous Juce to create programs for Android using C++.&lt;br /&gt;&lt;br /&gt;You can find out about Juce here: &lt;a href="http://www.rawmaterialsoftware.com/juce.php"&gt;http://www.rawmaterialsoftware.com/juce.php&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;If you haven't used Juce yet - give it a go! I've been using it for years now to create cross-platform programs for Mac and Windows...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-9091260663557633893?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/9091260663557633893/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=9091260663557633893' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/9091260663557633893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/9091260663557633893'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2011/06/juce-c-and-android.html' title='Juce, C++ and Android'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-2527709373040955887</id><published>2011-01-31T10:27:00.000Z</published><updated>2011-01-31T10:27:18.227Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='git sourcetree'/><title type='text'>SourceTree - git app for Mac</title><content type='html'>I've started using &lt;a href="http://www.sourcetreeapp.com/"&gt;SourceTree&lt;/a&gt; for painlessly reviewing historical changes in my Mac's git repository.&lt;br /&gt;&lt;br /&gt;Steve (the SourceTree developer) has just added a feature which easily allows you to visualise changes between arbitrary versions of any given file, which is far easier than trying to do with the git command-line tools!&lt;br /&gt;&lt;br /&gt;Give it a try - its a really nice tool!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-2527709373040955887?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/2527709373040955887/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=2527709373040955887' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/2527709373040955887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/2527709373040955887'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2011/01/sourcetree-git-app-for-mac.html' title='SourceTree - git app for Mac'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-6417826080772107305</id><published>2010-11-01T11:40:00.000Z</published><updated>2010-11-01T11:40:38.405Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='android ndk eclipse gdb'/><title type='text'>How to debug Android NDK code using Eclipse</title><content type='html'>This looks very useful, though I have yet to try it!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.eclipse.org/sequoyah/documentation/native_debug.php"&gt;http://www.eclipse.org/sequoyah/documentation/native_debug.php&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-6417826080772107305?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/6417826080772107305/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=6417826080772107305' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/6417826080772107305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/6417826080772107305'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2010/11/how-to-debug-android-ndk-code-using.html' title='How to debug Android NDK code using Eclipse'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-8322538650785041165</id><published>2010-10-07T11:59:00.002+01:00</published><updated>2010-10-07T12:02:34.482+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android popup menu'/><title type='text'>Android: creating pop-up menus at specific screen locations</title><content type='html'>If you need to create a pop-up menu in Android, anchored to a specific View on the screen you could use this simple code as a template:&lt;br /&gt;&lt;a href="http://www.londatiga.net/it/how-to-create-quickaction-dialog-in-android/"&gt;http://www.londatiga.net/it/how-to-create-quickaction-dialog-in-android/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;However, what if you want your pop-up to appear at a particular position on screen, where you don't have a View to anchor to (maybe to overlay some other element on-screen that you don't have ownership of)?&lt;br /&gt;&lt;br /&gt;My solution was as follows:&lt;br /&gt;- Create a new Linear Layout to use as a "canvas" - call it my_canvas - and set to fill parent.&lt;br /&gt;- Create a single ImageView (with empty drawable - it'll remain invisible!) within that layout, set to wrap content; call it my_canvas_image.&lt;br /&gt;- We then create dynamically a view based on the layout, with left and right margin properties to pixel-position to the correct place on screen; use the image in that view as the anchor for our pop-up; and remove the view when done.&lt;br /&gt;&lt;br /&gt;When your activity is created, grab the ViewGroup used to create the main activity layout like this:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LayoutInflater inflater = (LayoutInflater)getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ViewGroup appViewGroup = (ViewGroup) inflater.inflate(R.layout.myApp, null);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; setContentView(appView);&lt;br /&gt;&lt;br /&gt;When you need to create the pop-up at a given screen location, you can use code like this:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int screenWidth = windowManager.getDefaultDisplay().getWidth();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int screenHeight = windowManager.getDefaultDisplay().getHeight();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LinearLayout.LayoutParams paramsx = new LinearLayout.LayoutParams(screenWidth, screenHeight);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; paramsx.leftMargin = putPopUpHereX;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; paramsx.topMargin = putPopUpHereY;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; View &lt;i&gt;canvasView &lt;/i&gt;= inflater.inflate(R.layout.my_canvas, null);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; appViewGroup.addView(&lt;i&gt;canvasView&lt;/i&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ImageView &lt;i&gt;imageViewUseAsAnchor &lt;/i&gt;= (ImageView) canvasView.findViewById(R.id.my_canvas_image);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;... the &lt;i&gt;imageViewUseAsAnchor &lt;/i&gt;item can then be used as the "anchor" to which to attach the pop-up menu at your required screen location!&lt;br /&gt;&lt;br /&gt;When you've finished, you can then remove the "canvas" view with:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; appViewGroup.removeView(&lt;i&gt;canvasView&lt;/i&gt;);&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-8322538650785041165?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/8322538650785041165/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=8322538650785041165' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/8322538650785041165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/8322538650785041165'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2010/10/android-creating-pop-up-menus-at.html' title='Android: creating pop-up menus at specific screen locations'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-590682456475619475</id><published>2010-09-28T08:41:00.000+01:00</published><updated>2010-09-28T08:41:04.575+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android percentage layout'/><title type='text'>The art of scalable Android Layouts</title><content type='html'>One of the harder things to figure-out in Android, is how to do nice layouts that work well on different screen sizes. And, as always, I found it difficult to track-down that information!&lt;br /&gt;&lt;br /&gt;The key for me in many circumstances is to position elements in percentage terms, generally using &lt;b&gt;fill_parent&lt;/b&gt;; this is the opposite of most of the examples I have seen, which tend to use &lt;b&gt;wrap_content&lt;/b&gt;! My approach is to ensure that size is defined in relative terms from the top-down using &lt;b&gt;layout_weight&lt;/b&gt;; rather than allowing children to dictate their own size (and thereby mess-up the overall layout) via &lt;b&gt;wrap_content&lt;/b&gt;...!&lt;br /&gt;&lt;br /&gt;Here is a simple example of my approach.&lt;br /&gt;&lt;br /&gt;Imagine you have a screen which you want to split into two panels, aligned horizontally, where you want the right-most panel to take-up around 20% of the screen size.&lt;br /&gt;&lt;br /&gt;Create a new layout which is a frame layout. Set &lt;b&gt;layout_width&lt;/b&gt; and &lt;b&gt;layout_height&lt;/b&gt; to &lt;b&gt;fill_parent&lt;/b&gt;. We'll use this for most other elements.&lt;br /&gt;&lt;br /&gt;Create a &lt;b&gt;LinearLayout&lt;/b&gt; within the frame parent. Set &lt;b&gt;orientation &lt;/b&gt;to &lt;b&gt;horizontal&lt;/b&gt;. Set&lt;b&gt; layout_width&lt;/b&gt; and &lt;b&gt;layout_height&lt;/b&gt; to &lt;b&gt;fill_parent&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Create two elements (whatever type you need for your panels, maybe ImageView with a drawable background picture if you're just experimenting) as children of your new LinearLayout. Set both to have &lt;b&gt;layout_width&lt;/b&gt; of &lt;b&gt;0dp&lt;/b&gt; and &lt;b&gt;layout_weight&lt;/b&gt; of &lt;b&gt;50&lt;/b&gt;. If you want one layout to be wider than the other, simple adjust the weights; the element with the larger weight will be bigger proportionately. Make sure you sent &lt;b&gt;layout_height&lt;/b&gt; to be &lt;b&gt;fill_parent&lt;/b&gt;; otherwise the panels won't properly fill the screen in different configurations!&lt;br /&gt;&lt;br /&gt;Want to split-up your right-hand panel into two vertical elements? Replace your right-hand element with a new &lt;b&gt;LinearLayout&lt;/b&gt;. Set &lt;b&gt;layout_width&lt;/b&gt; to &lt;b&gt;0dp, &lt;/b&gt;and &lt;b&gt;layout_weight&lt;/b&gt; to whatever your previous right-hand element was (e.g. 50). Set &lt;b&gt;orientation &lt;/b&gt;to &lt;b&gt;vertical&lt;/b&gt;. Set&lt;b&gt; &lt;/b&gt;&lt;b&gt;layout_height&lt;/b&gt; to &lt;b&gt;fill_parent&lt;/b&gt;. Put two new elements (again, maybe ImageViews for example...) in the new LinearLayout; set both to have &lt;b&gt;layout_height&lt;/b&gt; of &lt;b&gt;0dp&lt;/b&gt; and &lt;b&gt;layout_weight&lt;/b&gt; of &lt;b&gt;50&lt;/b&gt;. If you want one layout to be taller than the other, simple adjust the weights. Make sure you sent &lt;b&gt;layout_width&lt;/b&gt; to be &lt;b&gt;fill_parent&lt;/b&gt;; otherwise (as before!) the panels won't properly fill the screen in different configurations.&lt;br /&gt;&lt;br /&gt;And so on! If you need to use an invisible spacer, you can simply follow the above approach and use an empty &lt;b&gt;LinearLayout &lt;/b&gt;with the appropriate &lt;b&gt;layout_weight&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;This makes sense once you've tried it out; remember to test the layout you create with a variety of AVD sizes!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-590682456475619475?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/590682456475619475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=590682456475619475' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/590682456475619475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/590682456475619475'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2010/09/art-of-scalable-android-layouts.html' title='The art of scalable Android Layouts'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-8980186748164877541</id><published>2010-09-16T15:04:00.000+01:00</published><updated>2010-09-16T15:04:57.712+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android pdk sdk service'/><title type='text'>Android - building the PDK using the SDK, and adding a system service</title><content type='html'>&lt;span id="internal-source-marker_0.34556112790279825" style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Just how difficult can it be to:&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;- download the Android source code&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;- figure-out how to add a system service&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;- call that service from an activity installed to the system after the event&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;- test this all out with the Android emulator.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;The answer is: a lot harder than you might think!&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Because  this was a complete pain, involving a lot of fiddling-around and  tracking-down and experimentation, I thought it would be a good to  set-down the steps I had to follow. I really hope it helps somebody else  out at some point!&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;I'm assuming that you're using Windows XP, Vista or 7 as your base machine.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: bold; text-decoration: underline; vertical-align: baseline;"&gt;Downloading the Android Source Code (Platform Development Kit - PDK)&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: bold; text-decoration: underline; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;The Android Platform Development Kit (PDK) download instructions are here.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://source.android.com/source/download.html"&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline;"&gt;http://source.android.com/source/download.html&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;First things first: install VirtualBox and install Ubuntu 32-bit as a Virtual Machine under Virtual Box.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Then install Android under this Virtual Machine.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;You’ll require the java5 jdk.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;The 64-bit build does not always work properly... it depends on which version of Android you’re using...:&lt;br class="kix-line-break" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;a href="http://groups.google.com/group/android-building/browse_thread/thread/193332fd6850a2a"&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline;"&gt;http://groups.google.com/group/android-building/browse_thread/thread/193332fd6850a2a&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;All the open-source codelines that mirror Google's internal froyo&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;branches (i.e. froyo and the various android-2.2) use 1.5 like&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Google's matching internal codelines do, since that is the version&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;that Google developed and tested with through the entire froyo&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;development cycle.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;We backported the changes to switch to version 1.6 (64-bit) from our&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;internal master branch to the open-source master just as we switched&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;our internal master branch to 1.6, since from that point there was no&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;requirement for contributions to the open-source master branch to&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;build under 1.5 any more. &lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; If you &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline;"&gt;need&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;  to use the 64-bit version, then in order to complete the sudo apt-get  install git-core ... command, you'll need to do this to get the correct  JDK configured:&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; # Tell the system where to get the JDK...&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; # Update the source list:&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; sudo apt-get update&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; # Install sun-java6-jdk;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; sudo apt-get install sun-java6-jdk&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;The build problems otherwise are very simiilar to those for the 32-bit system.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;However, various blocker issues arose. I gave up, and reverted to 32-bit building...&lt;/span&gt;&lt;/div&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;br class="kix-line-break" /&gt;&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline;"&gt;IMPORTANT NOTE&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;:  use the following as your repo init command... otherwise, you’ll get  “work-in-progress” which might not build (if you want a different  Android source code tag other than &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;froyo&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;, then feel free to use one):&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;"&gt;repo init -u git://android.git.kernel.org/platform/manifest.git -b &amp;nbsp;froyo&lt;/span&gt;&lt;/div&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;If you have problems with Java, try doing this:&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;sudo update-java-alternatives -s java-1.5.0-sun&lt;/span&gt;&lt;/div&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: bold; text-decoration: underline; vertical-align: baseline;"&gt;Building the Android Source Code&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: bold; text-decoration: underline; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;The Android PDK build instructions are here:&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://pdk.android.com/online-pdk/guide/build_system.html"&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline;"&gt;http://pdk.android.com/online-pdk/guide/build_system.html&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://pdk.android.com/online-pdk/guide/build_system.html"&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Here is what I did.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;cd ~/mydroid&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;lunch&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;# Choose 2. &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;"&gt;simulator&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;make&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;============================================&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;PLATFORM_VERSION_CODENAME=REL&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;PLATFORM_VERSION=2.2&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;TARGET_PRODUCT=sim&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;TARGET_BUILD_VARIANT=eng&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;TARGET_SIMULATOR=true&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;TARGET_BUILD_TYPE=debug&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;TARGET_BUILD_APPS=&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;TARGET_ARCH=x86&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;HOST_ARCH=x86&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;HOST_OS=linux&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;HOST_BUILD_TYPE=release&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;BUILD_ID=MASTER&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;============================================&lt;/span&gt;&lt;/div&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Note:  the alternative of trying choosecombo (selecting: simulator, debug,  eng) isn’t recommended by Google heads; they recommend the use of lunch.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;To fix this error...:&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;usr/include/bits/fcntl2.h:51:  error: call to ‘__open_missing_mode’ declared with attribute error:  open with O_CREAT in second argument needs 3 arguments&lt;/span&gt;&lt;/div&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;... I had to edit frameworks/base/core/jni/android_server_Watchdog.cpp&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;... and add this new argument at the end of the function call where the reference to O_CREAT:&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;, 0644);&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;a href="http://forum.archosfans.com/viewtopic.php?t=11426&amp;amp;start=4%29"&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline;"&gt;http://forum.archosfans.com/viewtopic.php?t=11426&amp;amp;start=4&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://forum.archosfans.com/viewtopic.php?t=11426&amp;amp;start=4%29"&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;To fix this error...:&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;frameworks/base/opengl/libagl/egl.cpp:  In member function ‘virtual EGLBoolean  android::egl_window_surface_v2_t::swapBuffers()’:  frameworks/base/opengl/libagl/egl.cpp:554: internal compiler error: in  add_phi_arg, at tree-phinodes.c:391&lt;/span&gt;&lt;/div&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;... I had to remove the const on line 554 in frameworks/base/opengl/libagl/egl.cpp&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;a href="http://stackoverflow.com/questions/3304951/build-android-system-on-ubuntu-10-04-x86-64-occrur-internal-compiler-error"&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline;"&gt;http://stackoverflow.com/questions/3304951/build-android-system-on-ubuntu-10-04-x86-64-occrur-internal-compiler-error&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://stackoverflow.com/questions/3304951/build-android-system-on-ubuntu-10-04-x86-64-occrur-internal-compiler-error"&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;If you get problems reported when building, related to a missing file called &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;asoundlib.h&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;, you’ll need to install these packages and then re-attempt the make:&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;libasound2-dev&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;lib32asound2-dev&lt;/span&gt;&lt;/div&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;If you get problems reported when building, related to a missing files called something similar to &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;wx/wxprec.h&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;, you’ll need to install this package (WxWidgets) and then re-attempt the make:&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;sudo &amp;nbsp;apt-get install libwxgtk2.6-0 libwxbase2.6-0 libwxbase2.6-dev&lt;/span&gt;&lt;/div&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;If you get problems reported when building like this:&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;|~/mydroid/development/simulator/app/DeviceWindow.cpp:175: undefined reference to `wxImage::HasAlpha() const'&lt;/span&gt;&lt;/div&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;br class="kix-line-break" /&gt;You’ll have to edit:&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;development/simulator/app/DeviceWindow.cpp - comment-out the lines to HasAlpha()&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;development/simulator/app/MainFrame.cpp - comment-out the lines to AppendSeparator()&lt;/span&gt;&lt;/div&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Modify  external/stlport/stl/_num_put.c in line 351. to use the first form of  the #ifdef block (the second one, which would otherwise be chosen,  causes compilation to fail).&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;br class="kix-line-break" /&gt;Remove  external/gtest/Android.mk, external/gtest/test/src/Android.mk and  external/gtest/test/Android.mk (which had STL-related problems in my  system!)&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: bold; text-decoration: underline; vertical-align: baseline;"&gt;Installing the Android SDK&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: bold; text-decoration: underline; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Download the Android 2.2 SDK from here:&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;a href="http://developer.android.com/sdk/index.html"&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline;"&gt;http://developer.android.com/sdk/index.html&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Expand the download file to e.g. ~/Downloads/android-sdk-linux_x86&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Add this to your PATH, e.g. (but: make sure this comes before any other Android-related paths...):&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;export PATH=$PATH:~/Downloads/android-sdk-linux_x86&lt;/span&gt;&lt;/div&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Restart your shell!&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;cd ~/Downloads/android-sdk-linux_x86/tools&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;export ANDROID_SWT=/home/mycompany/Downloads/android-sdk-linux_x86/tools/lib/x86&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;android&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;... Select and install the SDK Platform Android 2.2, API 8, revision 2&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Further notes on installing the Android SDK 2.2&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 72pt; margin-top: 0pt;"&gt;&lt;a href="http://developer.android.com/sdk/installing.html"&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline;"&gt;http://developer.android.com/sdk/installing.html&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 72pt; margin-top: 0pt;"&gt;&lt;a href="http://developer.android.com/sdk/adding-components.html"&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline;"&gt;http://developer.android.com/sdk/adding-components.html&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Now, copy the Platform SDK so that the PDK can find it!&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Create a new terminal, and then...&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;cd ~/mydroid&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;export PATH=/home/mycompany/mydroid/out/host/linux-x86/bin:$PATH&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;# Note that when you first do this, &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;~/mydroid/out/host/linux-x86/platforms&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; and &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;~/mydroid/out/host/linux-x86/add-ons &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;do NOT exist!&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;cp -pR \&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;~/Downloads/android-sdk-linux_x86/platforms \&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;~/Downloads/android-sdk-linux_x86/platforms \&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;out/host/linux-x86&lt;/span&gt;&lt;/div&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: bold; text-decoration: underline; vertical-align: baseline;"&gt;Running the emulator with the newly built image&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: bold; text-decoration: underline; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;# Create a new terminal, and then...&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;cd ~/mydroid&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;export PATH=~/mydroid/out/host/linux-x86/bin:$PATH&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt; text-indent: -36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;export ANDROID_SWT="~/mydroid/out/host/linux-x86/framework"&lt;/span&gt;&lt;/div&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;# Now-up the emulator with the correct image!&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;./out/host/linux-x86/bin/emulator  -system out/target/product/generic/system.img -sysdir  out/target/product/generic -kernel  prebuilt/android-arm/kernel/kernel-qemu -data  out/target/product/generic/userdata.img&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: bold; text-decoration: underline; vertical-align: baseline;"&gt;Adding a new service to the System&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: bold; text-decoration: underline; vertical-align: baseline;"&gt;&lt;br class="kix-line-break" /&gt;&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;With reference to:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://groups.google.com/group/android-porting/browse_thread/thread/f9a383ce949d1557?pli=1"&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: bold; text-decoration: underline; vertical-align: baseline;"&gt;http://groups.google.com/group/android-porting/browse_thread/thread/f9a383ce949d1557?pli=1&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://groups.google.com/group/android-porting/browse_thread/thread/f9a383ce949d1557?pli=1"&gt;&lt;span style="background-color: transparent; color: #000099; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: bold; text-decoration: underline; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Create a new service as frameworks/base/packages/IMyTest, as a very rough clone of frameworks/base/packages/SettingsProvider&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Edit build/target/product/core.mk, to add the following line after the line showing &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;DefaultContainerService&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; :&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; MyTestService \&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Create various files:&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;mydroid/frameworks/base/packages/MyTestService/AndroidManifest.xml&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;lt;manifest xmlns:android="http://schemas.android.com/apk/res/android"&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; package="com.mycompany"&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;application android:label="@string/service_name"&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;service android:name=".MyTestService"&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; android:enabled="true"&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; android:exported="true"/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/application&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&amp;lt;/manifest&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/div&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;mydroid/frameworks/base/packages/MyTestService/Android.mk&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;LOCAL_PATH:= $(call my-dir)&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;include $(CLEAR_VARS)&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;LOCAL_MODULE_TAGS := optional&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;LOCAL_SRC_FILES := $(call all-subdir-java-files)&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;LOCAL_PACKAGE_NAME := MyTestService&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;LOCAL_CERTIFICATE := platform&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;include $(BUILD_PACKAGE)&lt;/span&gt;&lt;/div&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;mydroid/frameworks/base/packages/MyTestService/src/com/mycompany/MyTestService.java&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;package com.mycompany;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;import com.mycompany.IMyTestService;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;import com.android.internal.content.PackageHelper;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;import android.content.Intent;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;import android.content.pm.IPackageManager;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;import android.content.pm.PackageInfo;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;import android.content.pm.PackageInfoLite;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;import android.content.pm.PackageManager;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;import android.content.pm.PackageParser;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;import android.net.Uri;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;import android.os.Environment;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;import android.os.IBinder;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;import android.os.ParcelFileDescriptor;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;import android.os.Process;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;import android.os.RemoteException;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;import android.os.ServiceManager;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;import android.os.StatFs;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;import android.app.IntentService;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;import android.util.DisplayMetrics;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;import android.util.Log;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;import java.io.File;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;import java.io.FileInputStream;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;import java.io.FileNotFoundException;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;import java.io.FileOutputStream;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;import java.io.IOException;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;import java.io.InputStream;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;import android.os.FileUtils;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;import android.provider.Settings;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;//&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;// Based on src/com/android/defcontainer/DefaultContainerService.java&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;// Also see:&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;// &amp;nbsp;&amp;nbsp;frameworks/base/packages/MyTestService/AndroidManifest.mk&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;// &amp;nbsp;&amp;nbsp;frameworks/base/packages/MyTestService/Android.mk&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;// &amp;nbsp;&amp;nbsp;frameworks/base/core/java/com/mycompany/IMyTestService.aidl&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;// &amp;nbsp;&amp;nbsp;frameworks/base/Android.mk&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;//&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;// Note that the .aidl file can be used by external activity projects.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;//&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;public class MyTestService extends IntentService {&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private static final String TAG = "MyTestService";&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private IMyTestService.Stub mBinder = new IMyTestService.Stub()&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; public void setValue(int val)&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Log.i(TAG, "In setValue! ");&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public MyTestService () {&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; super("MyTestService");&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; setIntentRedelivery(true);&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected void onHandleIntent(Intent intent)&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Log.i(TAG, "onHandleIntent!");&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public IBinder onBind(Intent intent) {&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Log.i(TAG, "onBind!");&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return mBinder;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;mydroid/frameworks/base/packages/MyTestService/res/values/strings.xml&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&amp;lt;resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- service name &amp;nbsp;--&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;string name="service_name"&amp;gt;MyTestService&amp;lt;/string&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&amp;lt;/resources&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;mydroid/frameworks/base/core/java/com/mycompany/IMyTestService.aidl&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;package com.mycompany;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;interface IMyTestService {&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; /**&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; * {@hide}&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; */&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; void setValue(int val);&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;The interface file will need to be added to the build system, so edit &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;frameworks/base/Android.mk&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;... and add the following at the end of the list of LOCAL_SRC_FILES:&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;core/java/com/mycompany/IMyTestService.aidl \&lt;/span&gt;&lt;/div&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Type this to make... if you don’t do the make clobber, your new MyTestService.apk file won’t be built!&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;make clobber&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;make&lt;/span&gt;&lt;/div&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;You will now see this error reported:&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;(unknown): error 3: Added class &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;IMyTest&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Service to package android.os&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;(unknown): error 3: Added class &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;IMyTest&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Service.Stub to package android.os&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;******************************&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;You have tried to change the API from what has been previously approved.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;To make these errors go away, you have two choices:&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;1) You can add "@hide" javadoc comments to the methods, etc. listed in the&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; errors above.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;2) You can update current.xml by executing the following command:&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; make update-api&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; To submit the revised current.xml to the main Android repository,&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; you will need approval.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;******************************&lt;/span&gt;&lt;/div&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Type this to work-around this:&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; make update-api&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Run this to verify that your new service is now in the build images...:&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;ls -ltr ~/mydroid/out/target/product/generic/system/app/MyTestService.apk&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;find . -name "*.img" | xargs -- grep "MyTestService.apk"&lt;/span&gt;&lt;/div&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;... This should show that the code you’ve created has appeared in &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;./userdata.img&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; ...&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Edit this to look for IMyTestService, &amp;nbsp;to verify that it has been added!&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;~/mydroid/frameworks/base/api/current.xml&lt;/span&gt;&lt;/div&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;5. Test the service APk is picked-up by the emulator...&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Start up the emulator (using the previous long command line!)&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Using &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;adb logcat&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;, you will find the message saying that the package has changed.&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;I/PackageManager( &amp;nbsp;&amp;nbsp;68): /system/app/MyTestService.apk changed; collecting cert&lt;/span&gt;&lt;/div&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;6. Test Program&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;To test the service, create a "Hello World" activity using the project wizard under Eclipse on Windows.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline;"&gt;MyServiceTest.java:&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;package com.mycompany.MyServiceTest;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;import android.app.Activity;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;import android.content.ComponentName;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;import android.content.Context;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;import android.content.Intent;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;import android.content.ServiceConnection;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;import android.os.Bundle;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;import android.os.IBinder;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;import android.util.Log;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;import com.mycompany.IMyTestService;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;public class MyServiceTest extends Activity {&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;/** Called when the activity is first created. */&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;IMyTestService imts;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;private ServiceConnection mConnection = new ServiceConnection()&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;@Override&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;public void onServiceConnected(ComponentName className, IBinder service)&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Log.d("MyServiceTest", "onServiceConnected");&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; imts= IMyTestService.Stub.asInterface(service);&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;try&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;// Try a dummy call to the service!&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; imts.setValue(7); // Any value would do, this is just a test!&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;catch (Exception e)&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;e.printStackTrace();&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;@Override&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;public void onServiceDisconnected(ComponentName arg0) {&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Log.d("MyServiceTest", "onServiceDisconnected");&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; imts = null;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;};&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;@Override&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;public void onCreate(Bundle savedInstanceState) {&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;super.onCreate(savedInstanceState);&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Log.d("MyServiceTest", "onCreate");&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;setContentView(R.layout.main);&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;// Bind-in to our service!&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Log.d("MyServiceTest", "try to bind service");&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Intent intent = new Intent();&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;intent.setClassName("com.mycompany", "com.mycompany.MyTestService");&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;bindService(intent, mConnection, Context.BIND_AUTO_CREATE);&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Log.d("MyServiceTest", "done try to bind service");&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; &amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Copy  the IMyTestService.aidl file from your Linux box, in your  Windows/Eclipse project’s src/com/mycompany sub-folder (you’ll first  have to create this folder in your activity’s project folders).&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Refresh your project files from the Eclipse menu and rebuild/debug.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;This should run benignly under Windows, warning that it was unable to find the service.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Copy the apk file to your Linux VM, and install using:&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt; adb install MyServiceTest.apk&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Run the app using the emulator’s launcher; you should see the service used!&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;I/MyTestService( &amp;nbsp;360): onBind!&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;D/MyServiceTest( &amp;nbsp;354): onServiceConnected&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;I/MyTestService( &amp;nbsp;360): In setValue!&lt;/span&gt;&lt;/div&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Easy, wasn't it? :-D&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: bold; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-8980186748164877541?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/8980186748164877541/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=8980186748164877541' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/8980186748164877541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/8980186748164877541'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2010/09/android-building-pdk-using-sdk-and.html' title='Android - building the PDK using the SDK, and adding a system service'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-3558805390370140409</id><published>2010-07-02T08:23:00.001+01:00</published><updated>2010-07-02T08:23:48.457+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mixtikl clipboard intua'/><title type='text'>Mixtikl - added clipboard support</title><content type='html'>The new version of Mixtikl adds &lt;a href="http://code.google.com/p/intua-audio-sharing/"&gt;Intua Clipboard&lt;/a&gt; support for the iPhone/iPod/iPad version, amongst many other updates! This Mixtikl update is a big step forward for us, we're really looking forward to releasing it in a few weeks!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-3558805390370140409?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/3558805390370140409/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=3558805390370140409' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/3558805390370140409'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/3558805390370140409'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2010/07/mixtikl-added-clipboard-support.html' title='Mixtikl - added clipboard support'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-3631475753202257144</id><published>2010-05-26T22:23:00.000+01:00</published><updated>2010-05-26T22:23:16.897+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mixtikl android'/><title type='text'>Android version of Mixtikl coming along</title><content type='html'>The tidy-up phase of the Android port of Mixtikl is coming on nicely. My shortlist of things to do is getting very short. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-3631475753202257144?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/3631475753202257144/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=3631475753202257144' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/3631475753202257144'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/3631475753202257144'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2010/05/android-version-of-mixtikl-coming-along.html' title='Android version of Mixtikl coming along'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-2908233202837689073</id><published>2010-05-20T14:58:00.000+01:00</published><updated>2010-05-20T14:58:28.034+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android sdk stl rtti c++ exceptions jni'/><title type='text'>Customized Android NDK r3 with enabled support of C++ exceptions, RTTI and Standard C++ Library</title><content type='html'>This looks very useful... (thanks to Chris for the pointer!)&lt;br /&gt;&lt;br /&gt;Customized Android NDK r3 with enabled support of C++ exceptions, RTTI and Standard C++ Library...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.crystax.net/android/ndk-r3.php"&gt;&lt;br /&gt;http://www.crystax.net/android/ndk-r3.php&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-2908233202837689073?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/2908233202837689073/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=2908233202837689073' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/2908233202837689073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/2908233202837689073'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2010/05/customized-android-ndk-r3-with-enabled.html' title='Customized Android NDK r3 with enabled support of C++ exceptions, RTTI and Standard C++ Library'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-1280551686024963304</id><published>2010-05-09T23:58:00.002+01:00</published><updated>2010-05-10T00:00:08.957+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mixtikl android symbian'/><title type='text'>Mixtikl on Android</title><content type='html'>The Mixtikl port to Android has been making further good progress; I think we're now only a couple of weeks from first release... it is working pretty well on my HTC Hero device, as I type this.&lt;br /&gt;&lt;br /&gt;Hopefully we'll be able to follow-suit with Symbian once the Android version is out of the door...!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-1280551686024963304?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/1280551686024963304/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=1280551686024963304' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/1280551686024963304'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/1280551686024963304'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2010/05/mixtikl-on-android.html' title='Mixtikl on Android'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-808868338357354187</id><published>2010-05-06T11:09:00.002+01:00</published><updated>2010-05-06T11:10:16.533+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MeeGo cygwin'/><title type='text'>MeeGo - how to download the source code using Cygwin / Windows</title><content type='html'>You can get the very latest MeeGo source code from here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://repo.meego.com/MeeGo/devel/trunk/repo/source/"&gt;http://repo.meego.com/MeeGo/devel/trunk/repo/source/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I downloaded all the rpm files easily enough using wget (under cygwin, on my Windows machine).&lt;br /&gt;&lt;br /&gt;To extract the contents of the downloaded rpm files, do this for each rpm file (assuming you have the rpm tools installed with cygwin!):&lt;br /&gt;&lt;br /&gt;rpm2cpio filexyz.rpm | cpio -idmv --no-absolute-filenames&lt;br /&gt;&lt;br /&gt;Then...&lt;br /&gt;&lt;br /&gt;For each extracted myfile.tar.gz file, do this:&lt;br /&gt;tar -xvf myfile.tar.gz&lt;br /&gt;&lt;br /&gt;And...&lt;br /&gt;&lt;br /&gt;For each extracted myfile.tar.bz2 file, do this:&lt;br /&gt;tar -jxvf myfile.tar.bz2&lt;br /&gt;&lt;br /&gt;You will then have all the latest MeeGo source code extracted to your computer!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-808868338357354187?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/808868338357354187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=808868338357354187' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/808868338357354187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/808868338357354187'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2010/05/meego-how-to-download-source-code-using.html' title='MeeGo - how to download the source code using Cygwin / Windows'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-111456899310133812</id><published>2010-04-30T13:38:00.001+01:00</published><updated>2010-04-30T23:18:20.273+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mixtikl'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='airplay'/><title type='text'>Mixtikl on Airplay - audio now working too!</title><content type='html'>Good progress - Mixtikl's Audio is now working under the Airplay ARM simulator, so I now need to get it all up-and-running on an actual Android device. Fingers crossed. :)&lt;br /&gt;&lt;br /&gt;Edit: Mixtikl is running under the Android simulator using Airplay - amazing. :-D&lt;br /&gt;&lt;br /&gt;Many congratulations to Ideaworks!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-111456899310133812?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/111456899310133812/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=111456899310133812' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/111456899310133812'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/111456899310133812'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2010/04/mixtikl-on-airplay-audio-now-working.html' title='Mixtikl on Airplay - audio now working too!'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-4628688205046595170</id><published>2010-04-29T12:55:00.000+01:00</published><updated>2010-04-29T12:55:43.176+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mixtikl'/><category scheme='http://www.blogger.com/atom/ns#' term='Symbian'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='airplay sdk'/><title type='text'>Mixtikl Airplay port - to Android/Symbian</title><content type='html'>I've been porting Mixtikl to Qt and Airplay DK in parallel.&lt;br /&gt;&lt;br /&gt;Now that the Qt port is done, I've also got the Airplay SDK port running in the ARM debugger emulator.&lt;br /&gt;&lt;br /&gt;I've yet to add the audio hooks, and there are a couple of rough edges, but I'm looking forward to trying it all out in a few days on my HTC Hero Android phone!&lt;br /&gt;&lt;br /&gt;Due to a weird problem with the Airplay SDK, I'm unable to link for X86 target (I'm waiting for a solution at &lt;a href="http://airplaysdk.com/node/761"&gt;http://airplaysdk.com/node/761&lt;/a&gt;). The same code builds fine however for the ARM Debugger - so at least I'm able to make progress. :)&lt;br /&gt;&lt;br /&gt;The documentation has been pretty frustrating, so here are two useful tips to save you time!&lt;br /&gt;- to blend-in an image, use Iw2DSetAlphaMode() to set a colour with the appropriate alpha channel setting before calling Iw2DDrawImage(); the alpha colour setting is used to blend the bitmap! Also, set the rgb values to other than 255, to scale the colour; useful to draw a white coloured bitmap in different colours, for example.&lt;br /&gt;- if you want to clip, then call IwGxSetScissorScreenSpace(...) to define a clip window before any calls to Iw2D*(...).&lt;br /&gt;&lt;br /&gt;The routine to query for pointer support didn't work for me - maybe I made the call wrong - I'm having to ignore the result from that call, I need to raise that in the forum once my build issue is resolved. :)&lt;br /&gt;&lt;br /&gt;Anyways, Mixtikl now runs on the ARM emulator, so the next step is to complete the audio hooks and try on Android and Symbian devices!&lt;br /&gt;&lt;br /&gt;Note: lack of support in Airplay for threads and clipboard will cut-back on some of the Mixtikl functionality for now on Android/Symbian... until those items are exposed in future Airplay updates!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-4628688205046595170?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/4628688205046595170/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=4628688205046595170' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/4628688205046595170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/4628688205046595170'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2010/04/mixtikl-airplay-port-to-androidsymbian.html' title='Mixtikl Airplay port - to Android/Symbian'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-7833890532789947677</id><published>2010-04-29T08:07:00.001+01:00</published><updated>2010-04-29T11:50:19.299+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mixtikl Qt C++ porting iPhone'/><title type='text'>Porting Mixtikl to Qt</title><content type='html'>It didn't take me long to port Mixtikl to Qt: just a few days to get it all running. Of course, it helps that Mixtikl was designed to be portable. :)&lt;br /&gt;&lt;br /&gt;The biggest gotcha was shown-up by a weird linker error relating to missing vtable for a class.&lt;br /&gt;&lt;br /&gt;It turns out that this was for a few reasons!&lt;br /&gt;&lt;br /&gt;1. If your class implements slots, the declaration *must* be put in a header file; put it in a .cpp file, and qmake won't won't find it and you get the vtable link error.&lt;br /&gt;2. That header file MUST be in your .pro file's list of header files; forget this, qmake won't won't find it and you get the vtable link error.&lt;br /&gt;3. Make sure your class has a special line added. You must have the Q_OBJECT line as the first line in your class prototype, as shown below - no punctuation at the end of the line!&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;class myclass : public QObject&lt;br /&gt;{&lt;br /&gt;  Q_OBJECT&lt;br /&gt;  // ... rest of class follows&lt;br /&gt;};&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;4. The class &lt;b&gt;must&lt;/b&gt; be derived from a class that ultimately derives from QObject&lt;br /&gt;5. Your slot implementation method &lt;b&gt;must&lt;/b&gt; have a "slots:" line before it. e.g.:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;public slots:&lt;br /&gt;  void setValue(int value);&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;6. You must then run &lt;b&gt;qmake&lt;/b&gt; from the console/terminal, while in the folder that contains your .pro file (that will rebuild the makefiles to pull-in the neceesary bits).&lt;br /&gt;&lt;br /&gt;One more thing to mention: I found using QTimer to be problematic if using threads; use QThread instead to roll your own timers if you have problems. I had similar issues with NSTimer on iPhone...&lt;br /&gt;&lt;br /&gt;Once you've figured that out, Qt is a piece of cake to use. A very easy to use, powerful, flexible C++ framework.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-7833890532789947677?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/7833890532789947677/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=7833890532789947677' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/7833890532789947677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/7833890532789947677'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2010/04/porting-mixtikl-to-qt.html' title='Porting Mixtikl to Qt'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-5203491947350138485</id><published>2010-04-21T08:37:00.002+01:00</published><updated>2010-04-26T15:17:53.248+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='apk'/><category scheme='http://www.blogger.com/atom/ns#' term='Symbian'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='airplay'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='sis'/><category scheme='http://www.blogger.com/atom/ns#' term='airplay sdk'/><title type='text'>Airplay SDK - building C++ apps as Android .apk files - first impressions</title><content type='html'>I noticed the other day that the &lt;a href="http://www.airplaysdk.com/"&gt;Airplay SDK&lt;/a&gt; now uses modern C++ with STL - nice, and essential for my code. I already knew that the Airplay SDK supported Android, and having taking a look at my Android porting options I really didn't want to directly port my own C++ app code to Android using STL and JNI - there would be too much pain involved. :-0&lt;br /&gt;&lt;br /&gt;So, having just installed the latest Android SDK on Windows 7 and Mac, I figured it was time - finally - to download and install the Airplay SDK evaluation.&lt;br /&gt;&lt;br /&gt;In installed the Windows version on my Mac under Boot camp. This requires Visual Studio 2008 (the Express edition should work, if you're interested...).&lt;br /&gt;&lt;br /&gt;Installation on Windows was easy, the eval license registered properly and I was soon following the instructions to build my first basic demo project. [I actually started with the Mac version - still in Beta - but it failed to register my eval license! Serves me right for starting with Beta software :)]&lt;br /&gt;&lt;br /&gt;I double-clicked the example project file for a 3d demo game, which automatically constructed and opened a suitably configured Visual Studio project. Building this for the x86 target was as easy as building any other Visual Studio project - very simple.&lt;br /&gt;&lt;br /&gt;Running-up the project under Visual Studio debugger for Windows, ran the app through a device emulator, which worked smoothly.&lt;br /&gt;&lt;br /&gt;I next trivially rebuilt the app for ARM Debug target, ran under Visual Studio under ARM emulator on Windows - again this was easy and worked fine - it runs the app through an arm device Emulator, with a graphical version of GDB as the debugger.&lt;br /&gt;&lt;br /&gt;Having rebuilt the app for ARM Release target, I next used a simple utility that comes with the Airplay SDK, to bundle-up the app an a .apk file (the installer format for Android). This was really easy. Note, however, that I first had to rename the Android SDK 1.6 folder on my PC (see the Airplay SDK forum for details on how/why!), and had to install a couple of other tools that are clearly documented in the Airplay documentation). Anyways: once your system is configured, building the .apk file is very easy. :)&lt;br /&gt;&lt;br /&gt;I next installed the .apk to the Android SDK's emulator using the "adb install" command, and ran-up the application directly from Android SDK emulator. This worked OK, albeit with a slow frame rate I've been told that on devices the frame rate is very, very much faster than the emulator).&lt;br /&gt;&lt;br /&gt;So, a really good experience so far. I'm looking forward to finding out more in due course. I was impressed enough to get a 99 dollar "indie" license; the "iPhone" license is actually free, which is very cool.&lt;br /&gt;&lt;br /&gt;I'll need to find out how well it all works on a real Android device, and try some complex 2D graphics and heavy-duty audio, but the Airplay SDK so far looks very promising. It is powerful enough that it even looks like it'd be relatively straightforward to port frameworks like Qt to the Airplay SDK.&lt;br /&gt;&lt;br /&gt;I found the online documentation to be a pain to navigate, but the documentation in Windows CHM file format (in the SDK) is pretty good.&lt;br /&gt;&lt;br /&gt;The bottom line for me is how easy it was to get from generic C++ code, to a .apk file for Android - very impressive indeed. Not only that, the SDK supports buildling Symbian .sis files, Window Mobile .cab files ... and various other platforms. Plenty here to keep me busy and productive!&lt;br /&gt;&lt;br /&gt;Edit: I've just discovered that Airplay doesn't support threads at the moment... which is problematic, to say the least!&lt;br /&gt;&lt;br /&gt;Edit: I've heard via the Airplay forums that Thread support is coming in a few months ... which is very good news. :) Meanwhile, the port of Mixtikl to Android/Symbian via Airplay (and also a port of Mixtikl via Qt...) is coming along well, so maybe we'll have something to report in a few weeks...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-5203491947350138485?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/5203491947350138485/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=5203491947350138485' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/5203491947350138485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/5203491947350138485'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2010/04/airplay-sdk-building-c-apps-as-android.html' title='Airplay SDK - building C++ apps as Android .apk files - first impressions'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-1278069794642835216</id><published>2010-04-19T15:28:00.000+01:00</published><updated>2010-04-19T15:28:30.339+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android qt sdl airplay'/><title type='text'>Port Qt and/or SDL to Android</title><content type='html'>I've been looking around to see if there are any ports of Qt or SDL to Android. This is by way of comparison to &lt;a href="http://www.airplaysdk.com/"&gt;the Airplay SDK&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;There are a couple of open-source projects that have been working towards this... though neither look pratical to my eyes at the moment.&lt;br /&gt;&lt;br /&gt;Qt port to Android:&lt;br /&gt;&lt;a href="http://code.google.com/p/android-lighthouse/wiki/QADK"&gt;http://code.google.com/p/android-lighthouse/wiki/QADK&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;SDL port to Android:&lt;br /&gt;&lt;a href="http://www.anddev.org/viewtopic.php?p=40838"&gt;http://www.anddev.org/viewtopic.php?p=40838&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It is a shame that none of the bigger software development companies haven't done this already - the port of Qt would be especially useful!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-1278069794642835216?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/1278069794642835216/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=1278069794642835216' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/1278069794642835216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/1278069794642835216'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2010/04/port-qt-andor-sdl-to-android.html' title='Port Qt and/or SDL to Android'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-118825643529064927</id><published>2010-04-18T21:32:00.000+01:00</published><updated>2010-04-18T21:32:26.459+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='in-app advertising'/><category scheme='http://www.blogger.com/atom/ns#' term='airplay sdk'/><title type='text'>Airplay, Android and in-app advertising</title><content type='html'>I've been thinking around the subject of Android, and am pretty certain that the only tenable model for app distribution on this platform is with in-app advertising.&lt;br /&gt;&lt;br /&gt;Of course, porting of a C++ app to Android is a complete pig, and I guess the option is either maybe via a port of SDL, or via Airplay.&lt;br /&gt;&lt;br /&gt;The issue with Airplay is how to display in-app advertising; there is no way that I can see to invoke native code from Airplay!&lt;br /&gt;&lt;br /&gt;Thinking around the subject, I was wondering if it were possible to install a native Android service that listens to a particular socket.&lt;br /&gt;&lt;br /&gt;My thought is that Airplay could communicate with that service via the socket, to send request to display an ad in a native pop-up Window (the service handles the display of the ad, outside of the context of Airplay).&lt;br /&gt;&lt;br /&gt;Anybody care to comment on this idea...? :-D&lt;br /&gt;&lt;br /&gt;Pete&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-118825643529064927?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/118825643529064927/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=118825643529064927' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/118825643529064927'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/118825643529064927'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2010/04/airplay-android-and-in-app-advertising.html' title='Airplay, Android and in-app advertising'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-3777822460344644909</id><published>2010-03-08T09:39:00.001Z</published><updated>2010-03-08T09:42:52.457Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='gcc optimization performance tuning example'/><title type='text'>Performance-tuning example with gcc</title><content type='html'>From time to time, I need to rip-apart functions to do some old-school performance tuning. This is really easy to do.&lt;br /&gt;&lt;br /&gt;Here is an example file, called perf.c ... in it, I have two versions of a function. One is inefficient, the other is more efficient by virtue of being written slightly differently.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;typedef unsigned char uint8_t;&lt;br /&gt;typedef unsigned short uint16_t;&lt;br /&gt;typedef unsigned int uint32_t;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// Inefficient inner loop&lt;br /&gt;&lt;br /&gt;void byteswap (const uint8_t *PpFrom, uint8_t *PpDst, uint32_t PBytes)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; long i;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; long lWords = PBytes &amp;gt;&amp;gt; 1;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (i=0; i &amp;lt; lWords; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsigned lWord = ((const uint16_t*)PpFrom)[i];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((uint16_t*)PpDst)[i] = ((lWord &amp;amp; 0x0ff) &amp;lt;&amp;lt; 8) | lWord &amp;gt;&amp;gt; 8;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Efficient inner loop&lt;br /&gt;&lt;br /&gt;void byteswap_2 (const uint8_t *PpFrom, uint8_t *PpDst, uint32_t PBytes)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32_t lWords = PBytes / 2;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t* PpDstPtr = (uint16_t *)PpDst;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t* PpDstEnd = PpDstPtr + lWords;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; const uint16_t* PpFromPtr = (const uint16_t *)PpFrom;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (;PpDstPtr &amp;lt; PpDstEnd;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsigned lWord = (*PpFromPtr++);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (*PpDstPtr++) = ((lWord &amp;amp; 0x0ff) &amp;lt;&amp;lt; 8) | lWord &amp;gt;&amp;gt; 8;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;From the command-line, run this command (assuming you have gcc!)&lt;br /&gt;&lt;br /&gt;&lt;code&gt;gcc -c -g -gstabs perf.c perf.s&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;This takes your source code (perf.c), and outputs the disassembled output to a file called &lt;i&gt;&lt;b&gt;perf.s&lt;/b&gt;&lt;/i&gt; ... which you can take a look at with your text editor.&lt;br /&gt;&lt;br /&gt;In the file, the code generated for the first function looks like this:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;.globl _byteswap&lt;br /&gt;.def    _byteswap;  .scl    2;  .type   32; .endef&lt;br /&gt;_byteswap:&lt;br /&gt;LFB3:&lt;br /&gt;.file 1 "perf.c"&lt;br /&gt;.loc 1 9 0&lt;br /&gt;pushl   %ebp&lt;br /&gt;LCFI0:&lt;br /&gt;movl    %esp, %ebp&lt;br /&gt;LCFI1:&lt;br /&gt;subl    $16, %esp&lt;br /&gt;LCFI2:&lt;br /&gt;.loc 1 11 0&lt;br /&gt;movl    16(%ebp), %eax&lt;br /&gt;shrl    %eax&lt;br /&gt;movl    %eax, -8(%ebp)&lt;br /&gt;.loc 1 13 0&lt;br /&gt;movl    $0, -12(%ebp)&lt;br /&gt;jmp L2&lt;br /&gt;L3:&lt;br /&gt;&lt;b&gt;&lt;i&gt;LBB2:&lt;br /&gt;.loc 1 15 0&lt;br /&gt;movl    8(%ebp), %edx&lt;br /&gt;movl    -12(%ebp), %eax&lt;br /&gt;addl    %eax, %eax&lt;br /&gt;leal    (%edx,%eax), %eax&lt;br /&gt;movzwl  (%eax), %eax&lt;br /&gt;movzwl  %ax, %eax&lt;br /&gt;movl    %eax, -4(%ebp)&lt;br /&gt;.loc 1 16 0&lt;br /&gt;movl    12(%ebp), %edx&lt;br /&gt;movl    -12(%ebp), %eax&lt;br /&gt;addl    %eax, %eax&lt;br /&gt;leal    (%edx,%eax), %ecx&lt;br /&gt;movl    -4(%ebp), %eax&lt;br /&gt;movl    %eax, %edx&lt;br /&gt;sall    $8, %edx&lt;br /&gt;movl    -4(%ebp), %eax&lt;br /&gt;shrl    $8, %eax&lt;br /&gt;orl %edx, %eax&lt;br /&gt;movw    %ax, (%ecx)&lt;br /&gt;LBE2:&lt;br /&gt;.loc 1 13 0&lt;br /&gt;addl    $1, -12(%ebp)&lt;br /&gt;L2:&lt;br /&gt;movl    -12(%ebp), %eax&lt;br /&gt;cmpl    -8(%ebp), %eax&lt;br /&gt;jl  L3&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;.loc 1 18 0&lt;br /&gt;leave&lt;br /&gt;ret&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The code generated for the second function looks like this:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;.globl _byteswap_2&lt;br /&gt;.def    _byteswap_2;    .scl    2;  .type   32; .endef&lt;br /&gt;_byteswap_2:&lt;br /&gt;LFB4:&lt;br /&gt;.loc 1 21 0&lt;br /&gt;pushl   %ebp&lt;br /&gt;LCFI3:&lt;br /&gt;movl    %esp, %ebp&lt;br /&gt;LCFI4:&lt;br /&gt;subl    $32, %esp&lt;br /&gt;LCFI5:&lt;br /&gt;.loc 1 22 0&lt;br /&gt;movl    16(%ebp), %eax&lt;br /&gt;shrl    %eax&lt;br /&gt;movl    %eax, -20(%ebp)&lt;br /&gt;.loc 1 24 0&lt;br /&gt;movl    12(%ebp), %eax&lt;br /&gt;movl    %eax, -16(%ebp)&lt;br /&gt;.loc 1 25 0&lt;br /&gt;movl    -20(%ebp), %eax&lt;br /&gt;addl    %eax, %eax&lt;br /&gt;addl    -16(%ebp), %eax&lt;br /&gt;movl    %eax, -12(%ebp)&lt;br /&gt;.loc 1 27 0&lt;br /&gt;movl    8(%ebp), %eax&lt;br /&gt;movl    %eax, -8(%ebp)&lt;br /&gt;jmp L6&lt;br /&gt;L7:&lt;br /&gt;&lt;b&gt;&lt;i&gt;LBB3:&lt;br /&gt;.loc 1 30 0&lt;br /&gt;movl    -8(%ebp), %eax&lt;br /&gt;movzwl  (%eax), %eax&lt;br /&gt;movzwl  %ax, %eax&lt;br /&gt;movl    %eax, -4(%ebp)&lt;br /&gt;addl    $2, -8(%ebp)&lt;br /&gt;.loc 1 31 0&lt;br /&gt;movl    -4(%ebp), %eax&lt;br /&gt;movl    %eax, %edx&lt;br /&gt;sall    $8, %edx&lt;br /&gt;movl    -4(%ebp), %eax&lt;br /&gt;shrl    $8, %eax&lt;br /&gt;orl %eax, %edx&lt;br /&gt;movl    -16(%ebp), %eax&lt;br /&gt;movw    %dx, (%eax)&lt;br /&gt;addl    $2, -16(%ebp)&lt;br /&gt;L6:&lt;br /&gt;LBE3:&lt;br /&gt;.loc 1 28 0&lt;br /&gt;movl    -16(%ebp), %eax&lt;br /&gt;cmpl    -12(%ebp), %eax&lt;br /&gt;jb  L7&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;.loc 1 33 0&lt;br /&gt;leave&lt;br /&gt;ret&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I've highlighted the assembly of the code generated for the two inner loops. Look how much more efficient the second version is, with only a simple bit of re-coding!&lt;br /&gt;&lt;br /&gt;It should be easy using this approach to learn how to make your code more efficient, without much effort.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-3777822460344644909?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/3777822460344644909/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=3777822460344644909' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/3777822460344644909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/3777822460344644909'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2010/03/performance-tuning-example-with-gcc.html' title='Performance-tuning example with gcc'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-2107527815144006328</id><published>2010-03-01T09:57:00.000Z</published><updated>2010-03-01T09:57:07.896Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='virtualbox vmware parallels'/><title type='text'>VisualBox, VMWare Player and Parallels</title><content type='html'>I've done quite a bit of work over the past year with PC-hosted Linux (Ubuntu) VMs under VMWare Player, mainly for Android work. I got so fed up recently with the poor system integration (poor Mouse and Keyboard transitioning when moving to/from host and the VM, no copy/paste between Windows and the VM, limited support for VM desktop resizing, not easy to share file data between host and VM), that I decided to spend some time looking at &lt;a href="http://www.virtualbox.org/"&gt;VirtualBox&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;After a day evaluating, I've now moved entirely to VirtualBox! I was even able to (easily) set-up 64-bit VMs running on 32-bit Windows, which was very handy; and it was simple to set-up a shared file area between host and VM.&lt;br /&gt;&lt;br /&gt;I haven't yet tried VirtualBox on Mac, but I'm perfectly happy with Parallels 5 at the moment so haven't felt the need to use anything else on Mac...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-2107527815144006328?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/2107527815144006328/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=2107527815144006328' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/2107527815144006328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/2107527815144006328'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2010/03/visualbox-vmware-player-and-parallels.html' title='VisualBox, VMWare Player and Parallels'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-4570395919483008892</id><published>2010-02-16T23:23:00.007Z</published><updated>2010-02-19T20:58:18.702Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows 7'/><category scheme='http://www.blogger.com/atom/ns#' term='Boot Camp'/><title type='text'>Windows 7 on my Mac</title><content type='html'>I finally took the plunge a few weeks back, and upgraded my Mac Book Pro hard drive (requiring a week with the Apple repair center to do the upgrade!), in preparation for replacing the Windows XP Boot Camp partition with a Windows 7 installation (with Windows XP moved from Boot Camp to a Parallels VM).&lt;br /&gt;&lt;br /&gt;The transition was fiddly; I used &lt;a href="http://www.parallels.com/download/desktop/"&gt;Parallels Transporter&lt;/a&gt; to copy the Boot Camp XP to a virtual machine image on an external USB drive (which I then copied to the Mac Hard Drive). I had to use a USB drive, as I couldn't get Parallels Transporter to work over my LAN. Once I'd proved that the VM started OK (and was backed up to my RAID drive!), I then got rid of the boot camp partition, and tried to install Windows 7 in a larger Boot Camp partition. However... I found was that the Mac drive was too fragmented to resize the Boot Camp partition (!).&lt;br /&gt;&lt;br /&gt;I did some reading around the subject, and was surprised to find that Macs don't have a defragmenter option...! My solution was not much fun, but was easier than it sounds: I cloned-off the hard drive using the incredible &lt;a href="http://www.shirt-pocket.com/SuperDuper/SuperDuperDescription.html"&gt;Super Duper!&lt;/a&gt; to another spare USB drive, double-checked that I could boot off that drive; then cloned-back the Super-Dupered drive back to replace the contents of my Mac Book drive. That fixed the fragmentation, so I could finally configure the Boot Camp partition as I wanted and proceed with installing Windows 7.&lt;br /&gt;&lt;br /&gt;I chose a 64-bit install of Windows 7 so that I could use Mixtikl and Noatikl VST plug-ins in 64-bit mode under Windows.&lt;br /&gt;&lt;br /&gt;Using 64-bit so far hasn't caused me too many problems; &lt;a href="http://www.scootersoftware.com/"&gt;Beyond Compare&lt;/a&gt; (which is still isn't available in a 64-bit version) did't integrate at first with Windows Explorer. However, thanks to a comment from Aaron from Scooter Soft (see below), I found the configuration option that let me re-configuration as a shell extension, which now works perfectly!&lt;br /&gt;&lt;br /&gt;There is also a 64-bit version of Tortise SVN which integrates with Windows Explorer OK. There is also a new version of Cygwin that works fine with Windows 7, and I found a 64-bit copy of GVim that integrates with Windows Explorer.&lt;br /&gt;&lt;br /&gt;All in all, Windows 7 is quite a bit faster than XP (though still not as fast as Mac OS!), and is in general easier to use now that I've customised Windows Explorer to work more like that in Windows XP. After a week of use, XP already seems dated and I have no intention of going back to it other than for occasional software testing! I also love the way that out-of-the-box, Windows 7 gave me a read-only view of the HFS partition on my Mac.&lt;br /&gt;&lt;br /&gt;So, what about a Windows 7 virtual desktop manager (Mac has the wonderful spaces built-in)? Well, simply install &lt;a href="http://virtuawin.sourceforge.net/downloads.php"&gt;VirtuaWin&lt;/a&gt; - it works beautifully, and is open source!&lt;br /&gt;&lt;br /&gt;Finally, you'll need &lt;a href="http://www.cygwin.com"&gt;Cygwin&lt;/a&gt; to get a greate scripting environment, which lets you share scripts between Windows and Mac.&lt;br /&gt;&lt;br /&gt;That said, there are far more tools for Windows than for Mac... so I am happy to use both Windows and Mac, mixing-and-matching where required. Where would I be without Beyond Compare and &lt;a href="http://tortoisesvn.tigris.org/"&gt;Tortoise SVN&lt;/a&gt; on the Windows side, for example? :) The combined Mac OS X/Windows/Parallels/Bootcamp system really is a good one for code development...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-4570395919483008892?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/4570395919483008892/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=4570395919483008892' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/4570395919483008892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/4570395919483008892'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2010/02/windows-7-on-my-mac.html' title='Windows 7 on my Mac'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-4471760272763169808</id><published>2010-02-16T09:08:00.001Z</published><updated>2010-02-16T23:00:58.728Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='mixtikl noatikl 64-bit windows mac'/><title type='text'>64-bit Noatikl and Mixtikl...</title><content type='html'>I'm currently working on creating 64-bit versions of Noatikl and Mixtikl...&lt;br /&gt;&lt;br /&gt;This is made easier for us on the Mac, which supports the use of Universal Binaries; there is quite a lot more fiddling around to do on Windows, where I have to build both separate binaries and a dual-configuration install that includes both 32-bit and 64-bit components.&lt;br /&gt;&lt;br /&gt;Incidentally, using &lt;a href="http://www.jrsoftware.org/isinfo.php"&gt;Inno Setup&lt;/a&gt; makes building a mixed-mode install very easy; what a great tool.&lt;br /&gt;&lt;br /&gt;Of course, having both 32-bit and 64-bit binaries makes testing even more time-consuming than usual...!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-4471760272763169808?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/4471760272763169808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=4471760272763169808' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/4471760272763169808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/4471760272763169808'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2010/02/64-bit-noatikl-and-mixtikl.html' title='64-bit Noatikl and Mixtikl...'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-6927861098757121541</id><published>2010-02-09T10:09:00.000Z</published><updated>2010-02-09T10:09:39.545Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='cygwin shell mintty rxvt'/><title type='text'>cygwin - alternative shells</title><content type='html'>While I love cygwin, I've never been totally happy with the standard Cygwin Shell Console, mainly in the way that it handles copy/paste, fonts and colour setting. But mainly copy/paste. :)&lt;br /&gt;&lt;br /&gt;Well, I've finally got around to reseaching some replacements, and like what I've found!&lt;br /&gt;&lt;br /&gt;Basically, I found a couple of good alternatives: mintty and rxvt. Neither of these require use of X, and both are available as optional packages that you can select from the standard cygwin installation.&lt;br /&gt;&lt;br /&gt;Note: neither of these work right with non-cygwin utilities that require piping. You need to keep the normal Cygwin Shell Console for that.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;mintty (http://code.google.com/p/mintty/)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;When you install this as a cygwin component, you'll find a shortcut created for you automatically under the Start menu.&lt;br /&gt;&lt;br /&gt;Next, I modified the shortcut to look like this:&lt;br /&gt;&lt;br /&gt;C:\cygwin\bin\mintty.exe bash -li&lt;br /&gt;&lt;br /&gt;However, when I started cygwin using this shortcut, my normal .profile scripts weren't picked-up properly. To fix this, I had to modify /etc/profile and add a line like this...&lt;br /&gt;&lt;br /&gt;export HOME=/cygdrive/c/home&lt;br /&gt;&lt;br /&gt;mintty then launches.&lt;br /&gt;&lt;br /&gt;What I love about this is that it gives a fully UTF-8 enabled shell, where it is really easy to cut/copy/paste text, and very easy to change colour schemes.&lt;br /&gt;&lt;br /&gt;Just right-click on a mintty window to see the copy/paste etc. options; dead easy.&lt;br /&gt;&lt;br /&gt;If you want to spawn-off a new console, use an alias like this:&lt;br /&gt;&lt;br /&gt;alias mintty='mintty --size=100,70 bash --login -i &amp;'&lt;br /&gt;&lt;br /&gt;mintty&lt;br /&gt;&lt;br /&gt;&lt;b&gt;rxvt&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This is also available under cygwin, but isn't fully Unicode aware, so isn't as good as mintty. You'll see problems for example when you try viewing a manual page; look at the funny text you get when you try this...:&lt;br /&gt;&lt;br /&gt;man bash&lt;br /&gt;&lt;br /&gt;That said, here is what I did to get it working.&lt;br /&gt;&lt;br /&gt;Basically, I took a copy of the cygwin.bat file, and modified part of it like this:&lt;br /&gt;&lt;br /&gt;rem bash --login -i&lt;br /&gt;rxvt  -sr -sl 2500 -sb -geometry 100x70 -fg black -bg white -tn rxvt -fn "Lucida Console-12" -e /usr/bin/bash --login -i&lt;br /&gt;&lt;br /&gt;I also created an alias in my .profile file, that allows me to launch new rxvt windows easily.&lt;br /&gt;&lt;br /&gt;alias rxvt='rxvt  -sr -sl 2500 -sb -geometry 100x70 -fg black -bg white -tn rxvt -fn "Lucida Console-12" -e /usr/bin/bash --login -i&amp;'&lt;br /&gt;&lt;br /&gt;With rxvt, you get a paste operation in one of two ways:&lt;br /&gt;- Ctrl-Shift-LeftButton&lt;br /&gt;- middle (press mouse wheel) - no good for MacBook devices with Track pad!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-6927861098757121541?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/6927861098757121541/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=6927861098757121541' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/6927861098757121541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/6927861098757121541'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2010/02/cygwin-alternative-shells.html' title='cygwin - alternative shells'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-8314737152828246393</id><published>2010-01-25T13:46:00.000Z</published><updated>2010-01-25T13:46:06.937Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='android native gdb debugging'/><title type='text'>Debugging Android native code - another useful link</title><content type='html'>Another Android native code debugging link that you might find of use...:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pdk.android.com/online-pdk/guide/debugging_native.html"&gt;http://pdk.android.com/online-pdk/guide/debugging_native.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-8314737152828246393?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/8314737152828246393/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=8314737152828246393' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/8314737152828246393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/8314737152828246393'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2010/01/debugging-android-native-code-another.html' title='Debugging Android native code - another useful link'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-8579577405897121679</id><published>2010-01-24T12:21:00.006Z</published><updated>2010-01-25T08:25:01.025Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='vim macvim objcpp objective-c objective-c++ syntax highlighting'/><title type='text'>vim - how to force .cpp files to have Objective-C syntax highlighting</title><content type='html'>This one has bugged me for a while - how to make vim and MacVim display .cpp files with full Objective-C++ syntax highlighting.&lt;br /&gt;&lt;br /&gt;This is actually really easy to do; I can't believe it took me so long to figure out! Especially as I try to avoid using .m or .mm files in my projects, and almost exclusively use .cpp source files in all that I do to make my cross-platform work easier...&lt;br /&gt;&lt;br /&gt;Anyways: all you have to do, is put these three lines in ~/.vim/filetype.vim (you'll almost certainly first have to create the .vim folder under your home directory...)&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;au BufNewFile,BufRead *.cpp set filetype=objcpp&lt;br /&gt;au BufNewFile,BufRead *.h set filetype=objcpp&lt;br /&gt;au BufNewFile,BufRead *.c set filetype=objcpp&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Sorted! Whenever you use the built-in vim, or MacVim, to edit a .cpp/.c/.h file, you'll see any Objective-C code in your editor displayed with nice syntax highlighting; your C++ code will also look lovely too!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-8579577405897121679?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/8579577405897121679/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=8579577405897121679' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/8579577405897121679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/8579577405897121679'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2010/01/vim-how-to-force-cpp-files-to-have.html' title='vim - how to force .cpp files to have Objective-C syntax highlighting'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-2437870686216993033</id><published>2010-01-18T20:23:00.002Z</published><updated>2010-01-18T20:36:15.734Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone Mixtikl Liptikl'/><title type='text'>Mixtikl update for iPhone coming soon - and Liptikl!</title><content type='html'>Tim and I both had a good break over Christmas; I think we both earned it after the long, hard push to releasing Mixtikl 2!&lt;br /&gt;&lt;br /&gt;Now that we're refreshed, we've been busy working on an update to Mixtikl, which tidies-up various loose ends and generally makes it easier to get into! We're aiming to release this in a few weeks.&lt;br /&gt;&lt;br /&gt;We've also been working on an iPhone version of Liptikl, which is fun and easy to use, so we hope to release that at some point after first releasing the Mixtikl update.&lt;br /&gt;&lt;br /&gt;For those who are interested in the technicalities of such things things, most of the primary development for Mixtikl is done under Xcode on the Mac, targeting the iPhone version. Because Mixtikl is 95% cross-platform, I actually have the option to work under either Windows (with Visual Studio) or Mac OS (with Xcode). Despite Visual Studio being &lt;i&gt;hugely&lt;/i&gt; more powerful than Xcode (with a &lt;i&gt;far&lt;/i&gt; nicer editor model, debugger etc. etc....), I find myself working mainly in Xcode. Why? Simply because Mac OS is a great deal faster than Windows for running all my development scripts. Xcode is a lot less nice to use than Visual Studio, but overall I'm faster on the Mac because Mac OS mainly because shell scripting runs so much quicker...! Because I use the same editor on both platforms (vim ...) I can move easily between the two whenever I need to. I must say however, that if cygwin scripting were a lot faster under Windows, then I'd be back to Windows. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-2437870686216993033?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/2437870686216993033/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=2437870686216993033' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/2437870686216993033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/2437870686216993033'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2010/01/mixtikl-update-for-iphone-coming-soon.html' title='Mixtikl update for iPhone coming soon - and Liptikl!'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-5499791936476509784</id><published>2010-01-18T11:53:00.005Z</published><updated>2010-01-18T20:19:53.707Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='android jni npapi thread callback'/><title type='text'>Android - NPAPI plugin - how to make a callback from the main thread</title><content type='html'>If you happen to be writing a browser plug-in using NPAPI/JNI for Android's built-in browser, and are doing some processing in the native side in C/C++ in a separate Posix thread; and want to get a callback into your native code from the main browser thread; you want to use this NPAPI function...!&lt;br /&gt;&lt;br /&gt;void &lt;b&gt;&lt;i&gt;NPN_PluginThreadAsyncCall&lt;/i&gt;&lt;/b&gt;(NPP instance,&lt;br /&gt;void (*func)(void *),&lt;br /&gt;void *userData);&lt;br /&gt;&lt;br /&gt;You can find some documentation on this if you search your Android source code for the file called &lt;b&gt;&lt;i&gt;npapi.cpp&lt;/i&gt;&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Basically, you call the above function from your native thread to register a callback function; the call to &lt;i&gt;NPN_PluginThreadAsyncCall&lt;/i&gt; returns immediately. At some future point in the very near future, the browser will call your supplied function &lt;i&gt;from the main browser thread&lt;/i&gt;, supplying the &lt;i&gt;userData&lt;/i&gt; that you provided when you registered your callback.&lt;br /&gt;&lt;br /&gt;Incidentally, if your Plug-in method is passed a JavaScript object that you're going to need to do something with at a later point (e.g. if you want to issue a deferred callback, through use of &lt;i&gt;NPN_PluginThreadAsyncCall&lt;/i&gt;), you need to remember to keep your JavaScript object alive until you're ready to use it, by calling:&lt;br /&gt;&lt;br /&gt;NPObject *&lt;b&gt;NPN_RetainObject&lt;/b&gt;(NPObject *npobj);&lt;br /&gt;&lt;br /&gt;Once you've used the object, remember to release it with:&lt;br /&gt;&lt;br /&gt;void &lt;b&gt;NPN_ReleaseObject&lt;/b&gt;(NPObject *npobj);&lt;br /&gt;&lt;br /&gt;Hopefully that'll be of use to some people!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-5499791936476509784?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/5499791936476509784/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=5499791936476509784' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/5499791936476509784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/5499791936476509784'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2010/01/android-npapi-plugin-how-to-make.html' title='Android - NPAPI plugin - how to make a callback from the main thread'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-5424733806122219275</id><published>2010-01-15T10:30:00.001Z</published><updated>2010-01-15T10:31:15.256Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='android obfuscate'/><title type='text'>Android - how to obfuscate your apps</title><content type='html'>If you're wondering how to obfuscate your Android apps, you should look at &lt;a href="http://proguard.sourceforge.net/"&gt;http://proguard.sourceforge.net/&lt;/a&gt; ...!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-5424733806122219275?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/5424733806122219275/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=5424733806122219275' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/5424733806122219275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/5424733806122219275'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2010/01/android-how-to-obfuscate-your-apps.html' title='Android - how to obfuscate your apps'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-514499269035701300</id><published>2010-01-04T11:44:00.001Z</published><updated>2010-01-18T11:33:47.711Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='android gdb'/><title type='text'>Android debugging with gdb?</title><content type='html'>For those of you that have been struggling to find information on how to debug under Android with GDB (for example, if you've been writing JNI code for Android...), this looks like a useful link to follow!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pdk.android.com/online-pdk/guide/debugging_gdb.html"&gt;http://pdk.android.com/online-pdk/guide/debugging_gdb.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Pete&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-514499269035701300?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/514499269035701300/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=514499269035701300' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/514499269035701300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/514499269035701300'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2010/01/android-debugging-with-gdb.html' title='Android debugging with gdb?'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-741816092684416840</id><published>2009-12-08T23:37:00.003Z</published><updated>2009-12-08T23:38:02.734Z</updated><title type='text'>My first Mix Tikl!</title><content type='html'>&lt;a href="http://t1kl.me?2PJAAIAAAAAAAAdpAqAAABOSBwAAACgkCYAAAC5IDgAAAMaQaAAAAVEAAAAACoAAAAAAVAAAAAACoAAAAAAVAAAAAACpAAAAAAVIAAAAAAA=="&gt;http://t1kl.me?2PJAAIAAAAAAAAdpAqAAABOSBwAAACgkCYAAAC5IDgAAAMaQaAAAAVEAAAAACoAAAAAAVAAAAAACoAAAAAAVAAAAAACpAAAAAAVIAAAAAAA==&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Amazing stuff. :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-741816092684416840?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/741816092684416840/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=741816092684416840' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/741816092684416840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/741816092684416840'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/12/my-first-mix-tikl.html' title='My first Mix Tikl!'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-9135759621296006603</id><published>2009-12-08T08:38:00.000Z</published><updated>2009-12-08T08:38:44.011Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='mixtikl V2 launch'/><title type='text'>Mixtikl 2 launch day - at last!</title><content type='html'>So here we are, Mixtikl 2 launch day.&lt;br /&gt;&lt;br /&gt;Product launch days are always a bit hard, there is always too much to do, and we're focused for now purely on completing the web side of things.&lt;br /&gt;&lt;br /&gt;The good news of course is that the software is stable and we're pretty happy with what we've created.&lt;br /&gt;&lt;br /&gt;As always, we're wondering what people will think of how we've changed and extended things. Of course, Mixtikl 2 looks quite a lot different to Mixtikl 1, some aspects of the UI have changed a lot and will take some getting used to for users of Mixtikl 1.&lt;br /&gt;&lt;br /&gt;We've featured generative content very strongly, and added what we think are some exciting new features aimed at collaboration and content sharing through text audio vectors. And, of course, we're now running on iPod/iPhone; I should think that some people will be interested to compare and contrast the experience of using Mixtikl on iPhone/iPod, compared to Windows Mobile. :)&lt;br /&gt;&lt;br /&gt;The biggest challenges for Mixtikl have been of our own making: a continued wish to have it run on as many platforms as possible; to have Mixtikl be usable on both touchable and non-touchable devices; to introduce extensive content sharing features which build on our long experience of "vector audio"; to introduce web browser plug-in variants.&lt;br /&gt;&lt;br /&gt;Whatever we do, we know that some people will love Mixtikl 2, others will hate it - and the struggle to create compelling generative software continues!&lt;br /&gt;&lt;br /&gt;Life certainly would be easier if we just supported one platform and just focused on one major feature; but then Mixtikl simply wouldn't be so interesting and kaleidoscopic! :)&lt;br /&gt;&lt;br /&gt;Pete&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-9135759621296006603?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/9135759621296006603/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=9135759621296006603' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/9135759621296006603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/9135759621296006603'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/12/mixtikl-2-launch-day-at-last.html' title='Mixtikl 2 launch day - at last!'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-3172845508478494774</id><published>2009-11-20T11:43:00.002Z</published><updated>2009-12-02T11:46:40.611Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='android jni ndk stl stlport'/><title type='text'>Moving to Android NDK 1.6 from Android NDK 1.5 ...</title><content type='html'>I've updated my Android configuration to NDK 1.6, and am using the latest STLPort download.&lt;br /&gt;&lt;br /&gt;There were a few things that changed, mainly system paths, as some posters to my blog were kind enough to point-out in earlier posts.&lt;br /&gt;&lt;br /&gt;Here are some notes on that process, from the point of view of a cygwin-based setup under Windows. The comments generally apply to Linux/Mac as well, however.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Getting STLPort&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I performed the "git" command for STLPort from within the root of the Android NDK folder, in other words from within this folder:&lt;br /&gt;&lt;br /&gt;C:\android-ndk-1.6_r1&lt;br /&gt;&lt;br /&gt;The command to use is this:&lt;br /&gt;&lt;br /&gt;git clone git://umbel.mooo.com/ndk-wrappers.git&lt;br /&gt;&lt;br /&gt;This puts the STLPort code in a slightly different place to where it was before, such that the code appears under the ndk-wrappers folder...&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;ndk-wrappers\stlport&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;... which you'll need to account for when you update the paths!&lt;br /&gt;&lt;br /&gt;There were a couple of other things that I found tricky to get right in this transition were as follows.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;env.sh&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;When you try running env.sh, you must do it with "source" otherwise the environment isn't updated properly. In other words, type this:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;source ./env.sh&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Application.mk&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;If your project is called "fred", then you need to have the following folder:&lt;br /&gt;&lt;br /&gt;C:\android-ndk-1.6_r1\apps\fred&lt;br /&gt;&lt;br /&gt;This should contain just one item, which is the Application.mk file, with the following (example!) two lines in it:&lt;br /&gt;&lt;br /&gt;APP_PROJECT_PATH := /cygdrive/c/DOCUME~1/me/MYDOCU~1/WORKSP~1/fred&lt;br /&gt;APP_MODULES      := fred&lt;br /&gt;&lt;br /&gt;&lt;b&gt;libstlport.a&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Once you've rebuilt STLPort, you need to copy libstlport.a (which seemed to be called libstlport.5.1.a in the previous build system... again, watch out for that!) to a new folder, which you'll need to create in the following location:&lt;br /&gt;&lt;br /&gt;C:\android-ndk-1.6_r1\out\apps\fred\libs&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The jni folder&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;You need to have at least two files (your source .cc file, and your Android.mk file) in the jni folder under your project, which is here in my example:&lt;br /&gt;&lt;br /&gt;C:\Documents and Settings\me\My Documents\workspace\fred\jni&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Android.mk&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In my example, the Android.mk file contains this data:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;LOCAL_PATH := $(call my-dir)&lt;br /&gt;&lt;br /&gt;include $(CLEAR_VARS)&lt;br /&gt;&lt;br /&gt;STLPORT_BASE := /cygdrive/c/android-ndk-1.6_r1/ndk-wrappers/stlport&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;LOCAL_MODULE    := fred&lt;br /&gt;LOCAL_CPP_EXTENSION := .cc&lt;br /&gt;LOCAL_CFLAGS += -I$(STLPORT_BASE)/stlport \&lt;br /&gt;-D__NEW__ \&lt;br /&gt;-D__SGI_STL_INTERNAL_PAIR_H \&lt;br /&gt;-DANDROID \&lt;br /&gt;-DOS_ANDROID&lt;br /&gt;LOCAL_SRC_FILES := fred.cc&lt;br /&gt;&lt;br /&gt;#Static Libraries:&lt;br /&gt;LOCAL_PREBUILT_LIBS :=  libs/libstlport.a&lt;br /&gt;include $(BUILD_MULTI_PREBUILT)&lt;br /&gt;LOCAL_STATIC_LIBRARIES := libs/libstlport&lt;br /&gt;&lt;br /&gt;include $(BUILD_SHARED_LIBRARY)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Good luck!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;That should be enough to get you up-and-running with NDK 1.6!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-3172845508478494774?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/3172845508478494774/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=3172845508478494774' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/3172845508478494774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/3172845508478494774'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/11/moving-to-android-ndk-16-from-android.html' title='Moving to Android NDK 1.6 from Android NDK 1.5 ...'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-7400673117822973522</id><published>2009-11-04T12:18:00.002Z</published><updated>2009-11-04T12:18:58.279Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mixtikl'/><title type='text'>Mixtikl 2 - coming December 8th 2009</title><content type='html'>The Mixtikl 2 release date has now been set at December 8th 2009.&lt;br /&gt;&lt;br /&gt;Can't wait! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-7400673117822973522?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/7400673117822973522/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=7400673117822973522' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/7400673117822973522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/7400673117822973522'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/11/mixtikl-2-coming-december-8th-2009.html' title='Mixtikl 2 - coming December 8th 2009'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-6025100358132916125</id><published>2009-10-08T07:54:00.000+01:00</published><updated>2009-10-08T07:54:09.209+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mixtikl'/><title type='text'>Mixtikl update</title><content type='html'>After a long push, Mixtikl 2 is now feature complete! We're now focussed on tidying-up a few loose ends, meaning that there is a good chance we'll be able to release for Mac/Win/Windows Mobile at the end of the month. We'll also submit the iPhone/iPod version to the app store at that time; that'll arrive at such time as Apple approve it!&lt;br /&gt;&lt;br /&gt;Amongst all the other stuff we've done for Mixtikl 2, we've created Mixtikl internet browser plug-ins for Mac and Windows, meaning that you'll be able to publish your Mixes and Partikl tracks on-line. Which is pretty cool! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-6025100358132916125?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/6025100358132916125/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=6025100358132916125' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/6025100358132916125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/6025100358132916125'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/10/mixtikl-update.html' title='Mixtikl update'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-3890043908877417681</id><published>2009-09-10T09:40:00.005+01:00</published><updated>2009-09-10T10:02:33.905+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jni'/><category scheme='http://www.blogger.com/atom/ns#' term='ndk'/><category scheme='http://www.blogger.com/atom/ns#' term='getting started'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='stl'/><title type='text'>How create a new JNI / STL based project for Android</title><content type='html'>Now that I've been through the process of creating new JNI / STL-based projects for Android a few times, I thought I'd summarise the steps; as you can see, they are pretty complicated! The problem isn't down to STL; the problem is one of the basic complexity of setting up a JNI-based project (which is never easy to get started, but is fine once you're up and running!).&lt;br /&gt;&lt;br /&gt;Note: the steps below assume you're using cygwin and Windows. You'd need to tweak them a little if you're using Mac or Linux.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;1. Make sure Eclipse uses a sensible workspace folder&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;NOTE!! I modified my Eclipse preferences to put my files in&lt;br /&gt;Documents and Settings/myname/My Documents/workspace&lt;br /&gt;rather than the Eclipse default of&lt;br /&gt;Documents and Settings/myname/workspace&lt;br /&gt;which I find really difficult to track-down and/or backup!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;2. Create a new Android Java project.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;a) Create a package called com.mycompany.MyStl, with your activity class called AdaptorClass&lt;br /&gt;&lt;br /&gt;Ensure the following code is in your ActivityClass source code... &lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;    // A native method that is implemented by the&lt;br /&gt;    // 'libMyStl' native library, which is packaged&lt;br /&gt;    public native String  stringFromSTL();&lt;br /&gt;&lt;br /&gt;    // Note: remember to put-in some test code that calls the above native method!!&lt;br /&gt;&lt;br /&gt;    // this will load the 'libMyStl.so' library on application startup.&lt;br /&gt;    static {&lt;br /&gt;        System.loadLibrary("MyStl");&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;b) you must add a "libs" folder to your project: and then add an "armeabi" sub-folder in this folder.&lt;br /&gt;&lt;br /&gt;c) Build the project (and fix any compilation errors) - but don't run it yet!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;3. Create the JNI / STL project&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;a) Create a folder in for your project, e.g.:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;  C:\android-ndk-1.5_r1\apps\MyStl&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;b) Create a file in this folder called Application.mk, which contains the following:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;APP_PROJECT_PATH := /cygdrive/c/DOCUME~1/MYNAME/MYDOCU~1/WORKSP~1/MyStl&lt;br /&gt;APP_MODULES      := MyStl&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;NOTE!! The path is a path with no spaces (as otherwise the Android NDK make system gets confused...!), and was generated using cygwin's cygpath command. You &lt;span style="font-style:italic;"&gt;must&lt;/span&gt; generate and use one that suits your user, using a command similar to the following...&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;  cygpath -dm /cygdrive/c/Documents\ and\ Settings/myname/My\ Documents/workspace&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;c) Make an empty folder in this folder called "project".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;4. Create the JNI / STL sources, and integrate with your Android project:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;a) Create a folder for your C++ source code, e.g.:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;  C:\android-ndk-1.5_r1\sources\MyStl&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;b) Create a file in this folder called Android.mk ...&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;LOCAL_PATH := $(call my-dir)&lt;br /&gt;&lt;br /&gt;include $(CLEAR_VARS)&lt;br /&gt;&lt;br /&gt;STLPORT_BASE := /cygdrive/c/android-ndk-1.5_r1/stlport&lt;br /&gt;&lt;br /&gt;LOCAL_MODULE    := MyStl&lt;br /&gt;LOCAL_CPP_EXTENSION := .cc&lt;br /&gt;LOCAL_CFLAGS += -I$(STLPORT_BASE)/stlport \&lt;br /&gt;     -D__NEW__ \&lt;br /&gt;     -D__SGI_STL_INTERNAL_PAIR_H \&lt;br /&gt;     -DANDROID \&lt;br /&gt;     -DOS_ANDROID&lt;br /&gt;LOCAL_SRC_FILES := MyStl.cc&lt;br /&gt;&lt;br /&gt;LOCAL_STATIC_LIBRARIES := /../../../../../stlport/build/lib/obj/gcc/ar/libstlport.5.1&lt;br /&gt;&lt;br /&gt;include $(BUILD_SHARED_LIBRARY)&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;c) Create a file in this folder called MyStl.cc ... note the instructions that follow in d) on how to re-generate your own method prototypes...!&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;/*&lt;br /&gt; * Class:     com_mycompany_MySTL_AdaptorClass&lt;br /&gt; * Method:    stringFromSTL&lt;br /&gt; * Signature: ()Ljava/lang/String;&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;// Prototype - make sure it uses C-style linkage!&lt;br /&gt;extern "C"&lt;br /&gt;{&lt;br /&gt;JNIEXPORT jstring JNICALL Java_com_mycompany_MyStl_AdaptorClass_stringFromSTL&lt;br /&gt;  (JNIEnv *, jobject);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Implementation&lt;br /&gt;JNIEXPORT jstring JNICALL Java_com_mycompany_MyStl_AdaptorClass_stringFromSTL&lt;br /&gt;  (JNIEnv *env, jobject)&lt;br /&gt;{&lt;br /&gt;    std::vector&lt;std::string&gt; lVector;&lt;br /&gt;    lVector.push_back("Hello from STL!");&lt;br /&gt;&lt;br /&gt;    std::string simple_string = lVector[0];&lt;br /&gt;&lt;br /&gt;    return env-&gt;NewStringUTF(simple_string.c_str());&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;d) Modify the MyStl.cc file...&lt;br /&gt;&lt;br /&gt;The prototype and implementation shown are just examples. You MUST construct your own by doing this:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;  cd "/cygdrive/c/Documents and Settings/myname/My Documents/workspace/MySTL/bin"&lt;br /&gt;  javah -jni com.mycompany.MySTL.AdaptorClass_MySTL&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Copy-out the generated prototype from the generated .h file that javah creates for your, and replace what I've shown above with the correct generated function prototype and function name.&lt;br /&gt;&lt;br /&gt;e) Then, build the library:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;  cd $NDK_HOME&lt;br /&gt;  ./env.sh&lt;br /&gt;  make APP=MySTL&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;f) &lt;span style="font-style:italic;"&gt;The first time you've built the library&lt;/span&gt;, you must drag the newly constructed .so file from Windows Explorer to your armeabi folder in the project. You must then right-click on the armeabi folder in Eclipse, and select "Refresh". The library is then bundled-in to your project bundle when you next build your Android project.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;5. You can now build and run your Android project!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;6. If you ever modify your C++ source...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Simply re-build the library (step 4e) and then re-build and run your Android project (step 5).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;7. If you need to add a new method...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You'll need to re-use javah to generate the correct prototype function signature to use. Add this to your STL project, re-make, re-build and you're done!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-3890043908877417681?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/3890043908877417681/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=3890043908877417681' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/3890043908877417681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/3890043908877417681'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/09/how-create-new-jni-stl-based-project.html' title='How create a new JNI / STL based project for Android'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-1592175083584067480</id><published>2009-09-08T08:50:00.005+01:00</published><updated>2009-09-08T09:08:36.801+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android ListView owner-draw lists java generics'/><title type='text'>Android Lists - using the ListView component</title><content type='html'>Whenever I write GUI code for a platform that is new to me, I always find myself stumped early-on figuring-out how to get simple list gadgets working.  After all, most simple applications are based around buttons and lists of data. Buttons are always easy to use, but lists are always a pain.&lt;br /&gt;&lt;br /&gt;Every platform seems to use a completely unique approach to creating lists; Android's approach is no exception in terms of how difficult it is to figure-out how to use its LiewView components. My opinion here is that the problem is down to the trend for using &lt;a href="http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller"&gt;Model-View-Controller&lt;/a&gt; architectures, which actually seem to get in the way of &lt;span style="font-style:italic;"&gt;deploying&lt;/span&gt; basic components like a list.&lt;br /&gt;&lt;br /&gt;Anyways: you'll find a really useful guide to creating multi-column lists on Android &lt;a href="http://www.vbsteven.be/blog/using-the-simpleadapter-with-a-listview-in-android/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The steps you need to follow:&lt;br /&gt;- create a new res/layout/mylayout.xml file, with the correct magic format and properties that you have to copy from what you can glean through internet searches&lt;br /&gt;- use some magic code based around Adapter classes&lt;br /&gt;- call the setAdapter method on your list&lt;br /&gt;&lt;br /&gt;For those who are interested, I think the Windows API model is by *far* the easiest (using owner-draw lists); a piece of cake to use. The Apple APIs (carbon/cocoa) are hideous. The Android APIs are probably the worst.&lt;br /&gt;&lt;br /&gt;I really wish that people who wrote APIs would concentrate on making the basic stuff easy, with lots of example code. Well done Microsoft for getting this stuff right in the first place. :)&lt;br /&gt;&lt;br /&gt;The good news about Java development these days is support for &lt;a href="http://en.wikipedia.org/wiki/Generics_in_Java"&gt;Java Generics&lt;/a&gt;; I'm very happy to find that Android supports them!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-1592175083584067480?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/1592175083584067480/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=1592175083584067480' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/1592175083584067480'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/1592175083584067480'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/09/android-lists-using-listview-component.html' title='Android Lists - using the ListView component'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-8881561603656112136</id><published>2009-08-28T09:08:00.004+01:00</published><updated>2009-08-28T09:29:01.481+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cppcheck'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Lint'/><category scheme='http://www.blogger.com/atom/ns#' term='PC-Lint'/><title type='text'>PC-Lint and Visual Lint</title><content type='html'>Writing software is always a challenge. When you are responsible for every line of code across multiple products and platforms, it is critical to write solid code that is as good as possible (bugs are very expensive to deal with!) :)&lt;br /&gt;&lt;br /&gt;The free lint tools (mainly &lt;a href="http://sourceforge.net/projects/cppcheck/"&gt;cppcheck&lt;/a&gt;) are OK but seem to miss lots of things compared to the professional tools, and I've been meaning to get a proper static code analysis tool for a long time now...&lt;br /&gt;&lt;br /&gt;So: I finally took the plunge a couple of days ago, and bought a license for &lt;a href="http://www.gimpel.com/html/pcl.htm"&gt;PC-Lint&lt;/a&gt;. I'd been meaning to do this for a long time, having slowly been improving my tool chain. The longer I do programming, the more I realise that it is critical to have as good a set of tools as possible, from operating system, editor, IDE, shell/scripting tools etc. ...!&lt;br /&gt;&lt;br /&gt;Having installed PC-Lint and started to use it... I soon realise how difficult it was to use, albeit very powerful. I have &lt;b&gt;never&lt;/b&gt; seen a tool with so many command line options, and stepping from command line output to change the code (and back again) is very difficult. So, imagine my complete relief to stumble upon &lt;a href="http://www.riverblade.co.uk/products/visual_lint/index.html"&gt;Visual Lint&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;For those who don't know, Visual Lint it is a GUI front-end for PC-Lint that makes it a piece of cake to use; it integrates beautifully with Visual Studio.&lt;br /&gt;&lt;br /&gt;One thing I like about the evaluation version of Visual Lint is that it makes it very easy for you to see which features you need, so you can end-up choosing the product variant that best meets your needs. I'm guessing I'll get the Professional Edition, and am still making my mind up; but I'm certain to get a copy in a few days.&lt;br /&gt;&lt;br /&gt;It is a shame that PC-Lint doesn't have an evaluation model. The software is certainly expensive; which is understandable, but a shame as it prevents more people improving the quality of their code.&lt;br /&gt;&lt;br /&gt;If only there were an integrated Static Code Analysis system for XCode on Mac. It seems that the availability of PC-Lint and Visual Lint gives a major advantage to Visual Studio on Windows for cross-platform coding, as much as I love the general speed of working on the Mac. I guess I'll continue to work on the Mac, but spend a little more time now on Windows analysing the cross-platform code I've written using Visual Lint.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-8881561603656112136?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/8881561603656112136/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=8881561603656112136' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/8881561603656112136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/8881561603656112136'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/08/pc-lint-and-visual-lint.html' title='PC-Lint and Visual Lint'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-2858515125302428768</id><published>2009-08-26T14:30:00.004+01:00</published><updated>2009-08-31T09:33:52.399+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++ auto_ptr arrays'/><title type='text'>auto_ptr with arrays - and a solution</title><content type='html'>It is pretty irritating that auto_ptr (a feature of C++, for those who don't know!) doesn't work with array variables.&lt;br /&gt;&lt;br /&gt;In other words, it is &lt;b&gt;not&lt;/b&gt; safe to do this:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;int *pArray = new int[10];&lt;br /&gt;auto_ptr&lt;int&gt; autodel(pArray);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;It is pretty easy however to create your own alternative to auto_ptr, that works with array pointers...&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;template &amp;lt;class T&amp;gt; class auto_ptr_array&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt;    auto_ptr_array(T *p) :&lt;br /&gt;        mp(p)&lt;br /&gt;    {&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    ~auto_ptr_array()&lt;br /&gt;    {&lt;br /&gt;        delete[] mp;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    void reset(T *p)&lt;br /&gt;    {&lt;br /&gt;        delete []mp;&lt;br /&gt;        mp = p;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    T *get()&lt;br /&gt;    {&lt;br /&gt;        return mp;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    T* release()&lt;br /&gt;    {&lt;br /&gt;        T* lpRet = mp;&lt;br /&gt;        mp = NULL;&lt;br /&gt;        return lpRet;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    T *mp;&lt;br /&gt;};&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Example usage...&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;int main (int argc, char *argv[])&lt;br /&gt;{&lt;br /&gt;    // Use it one of two ways...&lt;br /&gt;    auto_ptr_array&lt;int&gt; autodel(new int[20]);&lt;br /&gt;    int *pval = autodel.get();&lt;br /&gt;&lt;br /&gt;    int *pval2 = new int[20];&lt;br /&gt;    auto_ptr_array&lt;int&gt; autodel2(pval2);&lt;br /&gt;&lt;br /&gt;    printf ("Done!\n");&lt;br /&gt;&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-2858515125302428768?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/2858515125302428768/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=2858515125302428768' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/2858515125302428768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/2858515125302428768'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/08/autoptr-with-arrays-and-solution.html' title='auto_ptr with arrays - and a solution'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-5692521985195508451</id><published>2009-08-21T11:07:00.003+01:00</published><updated>2009-08-21T11:32:32.390+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android jni ndk stl stlport'/><title type='text'>Android NDK - getting STLPort up and running</title><content type='html'>If you want to get STLPort running with the Android NDK, you'll have a bit of work to do; especially if using Cygwin under Windows.&lt;br /&gt;&lt;br /&gt;First, visit &lt;a href="http://umbel.mooo.com/"&gt;http://umbel.mooo.com/&lt;/a&gt; and get the STLPort version from John Ripley (great job, John!). If you're a cygwin user, you'll first need to remember to install the &lt;i&gt;git&lt;/i&gt; package.&lt;br /&gt;&lt;br /&gt;Next thing is to copy the files to a place that works for you. On my system, I copied the files into my c:\android-ndk-1.5_r1 folder, and then moved the two &lt;i&gt;hello-stl&lt;/i&gt; folders to somewhere that seemed consistent with the other NDK files:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;C:\android-ndk-1.5_r1\apps\hello-stl&lt;br /&gt;C:\android-ndk-1.5_r1\sources\samples\hello-stl&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I then had to change a few files before I could build the STLPort...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;setup.sh&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Change the top few lines to look like this:&lt;br /&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;if uname | grep -qi linux; then&lt;br /&gt;  export &lt;b&gt;NDK_&lt;/b&gt;HOST=linux-x86&lt;br /&gt;&lt;b&gt;elif  uname | grep -qi CYGWIN; then&lt;br /&gt;  export NDK_HOST=windows&lt;br /&gt;else&lt;/b&gt;&lt;br /&gt;  export &lt;b&gt;NDK_&lt;/b&gt;HOST=darwin-x86&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;Change the third line up from the bottom to look like this:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;    ln -sf "$NDK_DIR/build/prebuilt/${&lt;b&gt;NDK_&lt;/b&gt;HOST}/arm-eabi-4.2.1/bin/arm-eabi-$tool" arm-linux-$tool&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;stlport/build/lib/android.mak&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Change the TOOLCHAIN_PREFIX line to look like this:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;TOOLCHAIN_PREFIX := $(NDK_DIR)/build/prebuilt/$(NDK_HOST)/arm-eabi-4.2.1/bin/arm-eabi-&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;sources/samples/hello-stl/Android.mk&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Change the STLPORT_BASE line to be this:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;STLPORT_BASE := /cygdrive/c/android-ndk-1.5_r1/stlport&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Change this:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;LOCAL_LDLIBS += -L$(STLPORT_BASE)/build/lib/obj/gcc/so \&lt;br /&gt;     -lstlport&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;to this:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;LOCAL_STATIC_LIBRARIES := libstlport.5.1&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Building STLPort&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Now that the files are merged-in, you're ready to build STLPort!&lt;br /&gt;&lt;br /&gt;Run the following in the cygwin shell... it will build the STLPort static library for you! You'll only need to do this once.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;export NDK_DIR=/cygdrive/c/android-ndk-1.5-r1&lt;br /&gt;cd $NDK_DIR&lt;br /&gt;./env.sh&lt;br /&gt;./setup.sh&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Now, do this to copy the file to your project:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;cp -p \&lt;br /&gt;/cygdrive/c/android-ndk-1.5_r1\stlport\build\lib\obj\gcc\ar\libstlport.5.1.a \&lt;br /&gt;/cygdrive/c/android-ndk-1.5_r1\out\apps\hello-stl\android-1.5-arm&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Building your project's shared library&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;You can now go back to the cygwin shell, and do this:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;cd /cygdrive/c/android-ndk-1.5_r1&lt;br /&gt;make APP=hello-stl&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;... which will build your shared library file:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;C:\android-ndk-1.5_r1\apps\hello-stl\project\libs\armeabi\libhello-stl.so&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Note that this will have the static STLPort library linked-in.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Building the hello-stl project&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;From Eclipse, use the New Project Wizard to create a new Android project for each sample, using the "Import from Existing Source" option and import the source from c:\android-ndk-1.5_r1\apps\hello-stl\project&lt;br /&gt;&lt;br /&gt;You can now build and run your project. The string displayed comes from the shared library, using std::string ...!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-5692521985195508451?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/5692521985195508451/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=5692521985195508451' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/5692521985195508451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/5692521985195508451'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/08/android-ndk-getting-stlport-up-and.html' title='Android NDK - getting STLPort up and running'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-8215523954088721543</id><published>2009-08-20T15:14:00.004+01:00</published><updated>2009-08-20T15:52:11.741+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android jni ndk eclipse getting started'/><title type='text'>Android JNI/NDK - notes on getting started</title><content type='html'>There are a lot of steps required to get your Android development environment set-up, to a state where you can create your first Android "Hello World" app with JNI/NDK.&lt;br /&gt;&lt;br /&gt;This is definitely not for the faint-hearted! It is complicated enough that I thought it'd be useful to run through in a blog entry.&lt;br /&gt;&lt;br /&gt;So, here is a summary of what to do, in order to get started with using the Android software under both Mac and Windows.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;1. Get the latest Sun Java SE Development Kit&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Windows&lt;/i&gt;: You can get this from here:&lt;br /&gt;&lt;a href="http://java.sun.com/javase/downloads/index.jsp"&gt;http://java.sun.com/javase/downloads/index.jsp&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Mac&lt;/i&gt;: You should already be up-to-date, assuming you have XCode installed&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;2. Get Eclipse&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I downloaded the latest version of the "Eclipse IDE for Java Developers" from here:&lt;br /&gt;&lt;a href="http://www.eclipse.org/downloads/"&gt;http://www.eclipse.org/downloads/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Windows&lt;/i&gt;: Unzip, and then put a shortcut to eclipse.exe somewhere where you can find it!&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Mac&lt;/i&gt;: Unstuff, and put Eclipse to your Applications folder.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;3. Get the base Android SDK (1.5 or later!)&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;As we're doing to be doing NDK development, make sure you get &lt;b&gt;&lt;i&gt;Android 1.5 or later&lt;/i&gt;&lt;/b&gt; from here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://developer.android.com/sdk/index.html"&gt;http://developer.android.com/sdk/index.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Make sure you follow the appropriate instructions for installing/upgrading (depending on what current system you might already have)&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Windows&lt;/i&gt;: When you unzip the file, make sure that it goes under the c:\ root folder... i.e. so it looks like this (for example):&lt;br /&gt;&lt;code&gt;&lt;br /&gt;c:\android-sdk-windows-1.5_r3&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Mac&lt;/i&gt;: Put this under your home folder, so it looks like this (for example):&lt;br /&gt;&lt;code&gt;&lt;br /&gt;~/android-sdk-windows-1.5_r3&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;4. &lt;i&gt;Windows&lt;/i&gt;: Get Cygwin&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The cygwin toolchain is required for NDK development if you're using Windows.&lt;br /&gt;&lt;br /&gt;So, make sure you have cygwin installed! You can get this from here:&lt;br /&gt;&lt;a href="http://www.cygwin.org"&gt;http://www.cygwin.org&lt;/a&gt;&lt;br /&gt;... note that you'll need the C/C++ developer tool packages.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Mac&lt;/i&gt;: users already have a suitable toolchain built-in through XCode.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;5. Get the Android NDK&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Get the latest Android NDK, from the "Native Development Tools" in the sidebar on in the sidebar on this page:&lt;br /&gt;&lt;a href="http://developer.android.com/sdk/index.html"&gt;http://developer.android.com/sdk/index.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Windows&lt;/i&gt;: When you unzip the files, make sure you copy them such that they are under the C:\ root folder, i.e. so that they look like this:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;c:\android-ndk-1.5_r1&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;... if you leave them under e.g. My Documents, then the system will fail to build your source code due to spaces in the file paths etc.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Mac&lt;/i&gt;: Put this under your home folder, so it looks like this (for example):&lt;br /&gt;&lt;code&gt;&lt;br /&gt;~/android-ndk-1.5_r1&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Make sure you follow the instructions that are in DOCS/INSTALL.TXT ...!!!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;6. &lt;i&gt;Windows&lt;/i&gt;: My Computer - path&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Remember to follow instructions on setting your path variable!&lt;br /&gt;&lt;br /&gt;Basically, append something like the following (which you'll have to change if you ever come to upgrade)&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;;c:\android-sdk-windows-1.5_r3;c:\android-ndk-1.5_r1&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;7. Create your first AVD&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;You can create your first AVD to be called something like my_android1.5 ... make sure you base it on the Android 1.5 SDK!&lt;br /&gt;&lt;br /&gt;You can do this from Eclipse; and more information is available here:&lt;br /&gt;&lt;a href="http://developer.android.com/guide/developing/tools/avd.html"&gt;http://developer.android.com/guide/developing/tools/avd.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Test that you set-up the NDK properly&lt;br /&gt;&lt;br /&gt;The following steps will create the following file:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;out/apps/hello-jni/android-1.5-arm/libhello-jni.so&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Windows&lt;/i&gt;:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;start cygwin&lt;br /&gt;cd /cygdrive/c/android-ndk-1.5_r1&lt;br /&gt;make APP=hello-jni&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Mac&lt;/i&gt;:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Run Terminal&lt;br /&gt;cd ~/android-ndk-1.5_r1&lt;br /&gt;make APP=hello-jni&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;8. Create your first basic Android Project&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Now follow the instructions here:&lt;br /&gt;&lt;a href=" http://developer.android.com/guide/developing/eclipse-adt.html#CreatingAProject"&gt;&lt;br /&gt;http://developer.android.com/guide/developing/eclipse-adt.html#CreatingAProject&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;... and if you're lucky, it will build and run, and you can then get on with the JNI/NDK side of things!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;9. Create and build/run your first NDK project&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;You can now create your first NDK project using JNI, and build/run it, following the steps you'll find here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://developer.android.com/sdk/ndk/1.5_r1/index.html#samples"&gt;http://developer.android.com/sdk/ndk/1.5_r1/index.html#samples&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Easy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-8215523954088721543?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/8215523954088721543/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=8215523954088721543' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/8215523954088721543'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/8215523954088721543'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/08/android-jnindk-notes-on-getting-started.html' title='Android JNI/NDK - notes on getting started'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-476507067907812994</id><published>2009-08-20T09:01:00.005+01:00</published><updated>2009-08-20T09:25:58.130+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='find xargs unix linux mac terminal cygwin bash'/><title type='text'>Using find with xargs in Linux/Mac/Unix/Cygwin with spaces in the file paths</title><content type='html'>I'm always having to perform searches through lots of files when on Mac/Linux/Cygwin&lt;br /&gt;&lt;br /&gt;This is the style of command I'd normally use from the  bash shell (Terminal) on Mac/Linux/Unix/Cygwin ...&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;find . -name "*.cpp" | xargs -- grep -i "find me" &gt; q.q&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;This looks from the current folder (and all files below), searching for all files with the cpp file extension. For every file, it runs grep on it (case insensitively); putting the results of all searches in the file called q.q (which you can then edit using e.g. vim).&lt;br /&gt;&lt;br /&gt;However, this simply doesn't work when the file or folder being searched has a space character in it. Which is annoyingly common in a files these days...&lt;br /&gt;&lt;br /&gt;A short while back I discovered the solution to this "spaces in names/folders" problem, and I figured it'd be useful to write it up to save you the trouble...&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;find . -name "*.cpp" &lt;u&gt;-print0&lt;/u&gt; | xargs &lt;u&gt;-0&lt;/u&gt; -- grep -i "find me" &gt; q.q&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Note how we've added both &lt;code&gt;-print0&lt;/code&gt; and &lt;code&gt;-0&lt;/code&gt;, which together magically solve the problem.&lt;br /&gt;&lt;br /&gt;Incidentally, the &lt;code&gt;--&lt;/code&gt; in the argument list for xargs, is shell magic that tells xargs to ignore any options it might see after that point (e.g. the -i in the example), and simply pass them directly on to the command (grep in our example).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-476507067907812994?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/476507067907812994/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=476507067907812994' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/476507067907812994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/476507067907812994'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/08/using-find-with-xargs-in.html' title='Using find with xargs in Linux/Mac/Unix/Cygwin with spaces in the file paths'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-1405938385323460590</id><published>2009-08-18T15:13:00.004+01:00</published><updated>2009-08-18T15:23:27.009+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android jni ndk stl stlport'/><title type='text'>Android JNI NDK - and STL support?</title><content type='html'>There is an interesting post &lt;a href="http://groups.google.com/group/android-ndk/search?group=android-ndk&amp;q=stlport&amp;qt_g=Search+this+group"&gt;that you can find here&lt;/a&gt;, which indicates that it is possible to get STL support working in C++ code that you might want to port to the Android JNI / NDK, using &lt;a href="http://www.stlport.org/"&gt;STLPort&lt;/a&gt;. Cool!&lt;br /&gt;&lt;br /&gt;This is really interesting; I think this was the biggest issue that was blocking a port of Mixtikl to Android devices (I think I can see a way around most other issues). So, I now need to clear some time in my schedule to investigate in more detail! :)&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.stlport.org/product.html"&gt;STLPort info page&lt;/a&gt; has more details, and the &lt;a href="http://www.stlport.org/doc/license.html"&gt;license&lt;/a&gt; looks promising; all-in-all, this is very exciting!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-1405938385323460590?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/1405938385323460590/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=1405938385323460590' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/1405938385323460590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/1405938385323460590'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/08/android-jni-ndk-and-stl-support.html' title='Android JNI NDK - and STL support?'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-320493462803912575</id><published>2009-08-14T10:55:00.003+01:00</published><updated>2009-08-14T11:01:29.930+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mixtikl v2'/><title type='text'>Mixtikl ... V2!</title><content type='html'>We've put so much effort in to Mixtikl V1.5 ... and reworked so many things... that it seems to have evolved into Mixtikl V2. Right under our very eyes!&lt;br /&gt;&lt;br /&gt;So, the release of the new version of Mixtikl is going to be quite a lot later than we planned early this year, but that is all part of the fun of designing and coding on the fly. You never know exactly where things will take you! :)&lt;br /&gt;&lt;br /&gt;Right now we're focused on finishing off all the UI rework, and then fixing-up the bugs that the rework has (inevitably) introduced. I hope it is worth the wait!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-320493462803912575?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/320493462803912575/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=320493462803912575' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/320493462803912575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/320493462803912575'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/08/mixtikl-v2.html' title='Mixtikl ... V2!'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-6248912804134630728</id><published>2009-08-14T10:40:00.005+01:00</published><updated>2009-08-14T13:21:34.956+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GTK'/><category scheme='http://www.blogger.com/atom/ns#' term='EnumWindows'/><title type='text'>GTK - how to enumerate widgets</title><content type='html'>I had fun recently trying to figure-out the code that would allow me to enumerate through all available GTK Widgets, a little bit like the Windows &lt;span style="font-style:italic;"&gt;EnumWindows&lt;/span&gt; function. This took me a while to figure out... mainly because of the terrible state of the GTK documentation. :)&lt;br /&gt;&lt;br /&gt;Anyways, here is the bare bones of the solution; as you can see, it is actually really easy.&lt;br /&gt;&lt;br /&gt;A couple of things to note:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;- a GtkWindow can be treated as a GtkWidget...!&lt;/li&gt;&lt;li&gt;- if a GtkWindow has child widgets, then it must be of type GTK_CONTAINER&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;pre&gt;static void widgetEnumerate (int nDepth, GtkWidget *pGtkWidget)&lt;br /&gt;{&lt;br /&gt;  printf ("%d: Got GtkWidget=%x\n", nDepth, pGtkWidget);&lt;br /&gt;&lt;br /&gt;  // If the GtkWidget in question is a also a container,&lt;br /&gt;  // then we can enumerate through its children!&lt;br /&gt;  if (GTK_IS_CONTAINER(pGtkWidget)&lt;br /&gt;  {&lt;br /&gt;    GtkContainer *pGtkContainer = GTK_CONTAINER(pGtkWidget);&lt;br /&gt;    GList *pGtkWindowList = gtk_container_get_children(pGtkContainer);&lt;br /&gt;&lt;br /&gt;    GList *pNode;&lt;br /&gt;    for (pNode = pGtkWindowList; pNode != NULL; pNode = pNode-&gt;next)&lt;br /&gt;    {&lt;br /&gt;      GtkWidget *pGtkWidget = GTK_WIDGET(pNode-&gt;data);&lt;br /&gt;      widgetEnumerate(nDepth+1, pGtkWidget);&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void enumerateGtkWidgets(void)&lt;br /&gt;{&lt;br /&gt;  GList *pGtkWindowList = gtk_window_list_toplevels();&lt;br /&gt;  GList *pNode;&lt;br /&gt;  for (pNode = pGtkWindowList; pNode != NULL; pNode = pNode-&gt;next)&lt;br /&gt;  {&lt;br /&gt;    GtkWindow *pGtkWindow = GTK_WINDOW(pNode-&gt;pData);&lt;br /&gt;    widgetEnumerate(1, GTK_WIDGET(pGtkWindow));&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-6248912804134630728?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/6248912804134630728/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=6248912804134630728' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/6248912804134630728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/6248912804134630728'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/08/gtk-how-to-enumerate-widgets.html' title='GTK - how to enumerate widgets'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-1533388450103978983</id><published>2009-08-10T20:58:00.003+01:00</published><updated>2009-08-10T21:01:43.127+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone XCode provisioning profile'/><title type='text'>iPhone - problems updating the Ad-Hoc Provisioning Profile</title><content type='html'>If you get the following error in XCode after having updated your Ad-Hoc provisioning profile...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;CodeSign error: a valid provisioning profile is required&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;... then don't panic - help is at hand - &lt;a href="http://iphonesdkdev.blogspot.com/2009/01/codesign-error-valid-provisioning.html"&gt;here&lt;/a&gt;! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-1533388450103978983?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/1533388450103978983/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=1533388450103978983' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/1533388450103978983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/1533388450103978983'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/08/iphone-problems-updating-ad-hoc.html' title='iPhone - problems updating the Ad-Hoc Provisioning Profile'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-7506639119450214681</id><published>2009-08-07T07:37:00.002+01:00</published><updated>2009-08-07T08:05:19.562+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android iphone windows mobile C++ C# Java symbian'/><title type='text'>Porting from iPhone to Windows Mobile?</title><content type='html'>I found this article a couple of days back on the MSDN site - &lt;a href="http://msdn.microsoft.com/en-us/library/ee355030.aspx"&gt;Porting the Amplitude Application from the iPhone to a Windows Mobile Device – a Case Study&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The article talks us through porting an iPhone app to Windows Mobile. This is a good idea of course - but the article decided to use C# as the language in which to &lt;span style="font-style: italic;"&gt;completely rewrite the app for Windows mobile!&lt;/span&gt; This got me wondering why anybody would want to use anything other than C++ for writing &lt;span style="font-style: italic;"&gt;applications&lt;/span&gt; (as much as I really like C# as a language), excepting of course those platforms where you have no choice.&lt;br /&gt;&lt;br /&gt;The big thing about the iPhone - for me! - is that one of Apple's several great decisions was to adopt Cocoa as their platform. This means that apps are written in Objective-C ... and, if you want, you can use Objective-C++ as well. This means that all of your app code can be written in platform-neutral C++ ... with only the UI-specific code [which is based around the Cocoa Touch framework] being in Objective-C. This way, all of your non-UI code should be easy to port to any other platform that supports C++. &lt;span style="font-style: italic;"&gt;Note: this approach assumes that you isolate and minimise your use of low-level Cocoa elements such as NSString as much as possible! This is easy to do if you use things like your own String adaptor classes, which wrap-up this platform specific stuff in a platform-neutral manner.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;The nice thing about Windows Mobile is that all your code can be written in C++. So... why would you want to use a completely different language - C# in this case - as your language? &lt;span style="font-style: italic;"&gt;Why not instead keep as much of your code as cross-platform as possible, and use C++, which is natively supported for Windows Mobile? Then you have to do much less work to port and maintain your application.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Oh well.&lt;br /&gt;&lt;br /&gt;While doing some Android consultancy work recently, it was strange to reflect that all of the code had to be written in Java. I've got nothing against Java per se, it is just the annoying thought that all the code I wrote could not get re-used on other platforms.&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;I can but hope that Android's NDK eventually matures to the point where we can write write most of our graphics code in C++.&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;As for Symbian - I won't look at that again until they base their development on a standard version of C++ with STL template support and Posix threads ... :)&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-7506639119450214681?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/7506639119450214681/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=7506639119450214681' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/7506639119450214681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/7506639119450214681'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/08/porting-from-iphone-to-windows-mobile.html' title='Porting from iPhone to Windows Mobile?'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-8907273105465764971</id><published>2009-07-27T13:08:00.004+01:00</published><updated>2009-07-27T13:27:14.568+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Inno Setup'/><category scheme='http://www.blogger.com/atom/ns#' term='cabwiz'/><category scheme='http://www.blogger.com/atom/ns#' term='PackageBuilder'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Building installs</title><content type='html'>I thought I'd share some of what I've learned in building installs for Windows, Mac, Windows Mobile and iPhone.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Windows: Inno Setup&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is free from &lt;a href="http://www.jrsoftware.org/isinfo.php"&gt;http://www.jrsoftware.org/isinfo.php&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Inno Setup is a marvellous tool, making it really easy to auto-build "standard looking" setup .exe files using scripts. I use cygwin bash shell to grab my latest files, build the setup .exe files and zip them up - dead easy. Spread the word!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Mac: PackageBuilder - free from Apple&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Some apps are simple enough just to distribute as zipped-up Disk Images, from which the user can drag the embedded .app file to their Applications folder. However, applications that are more complex (such as Noatikl, which includes various components including Audio Unit and VSTi variants) are tougher to build installs for.&lt;br /&gt;&lt;br /&gt;PackageBuilder is built-in to XCode, and builds good looking "Mac Standard" installs, but it is a pain to drive it automatically. I use one bash shell script to copy all the bits I need under a build folder, then I run the PackageBuilder manually using pre-prepared configuration file (can't figure-out how to run it from the command line!) (making sure I save the .pkg files into the right folder... that'll catch you out if you're not careful!) and then a second script to build the pkg file into a .dmg file, then zip it up.&lt;br /&gt;&lt;br /&gt;Both these tools allow you to embed licenses that the user has to agree to in order to complete the install, which was important to us; in both cases, those text files can come from .rtf files so they're nicely formated!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;PackageBuilder with XCode 3&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you're using XCode 3.0, and have tried to build an installer package and encountered all sorts of annoying problems that prevent it from working; don't despair.&lt;br /&gt;&lt;br /&gt;Instead, do what I did, and copy/use intead the PackageBuilder.app from from an XCode 2.x distribution; this works, and means you can totally avoid the buggy version in XCode 3.0 ... :)&lt;br /&gt;&lt;br /&gt;This fixes the problem where when your application gets installed, it appears in /Library/Applications rather than ~/Applications ... this is such a huge bug, I'm amazed it actually got into XCode 3 ... oh well!&lt;br /&gt;&lt;br /&gt;Here is an outline bash script that you could use. Note the use of sudo to get around some file permission problems; basically, if the files that you work with don't have the appropriate permissions, they won't get installed properly on the target Mac.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;sudo /Developer/Tools/packagemaker \&lt;br /&gt;-build \&lt;br /&gt;-v \&lt;br /&gt;-p myprod/install/macosx/myprod_mac.pkg \&lt;br /&gt;-proj imyprod/liptikl/install/macosx/myprod_mac.pmproj \&lt;br /&gt;-f ./myprod_install_root \&lt;br /&gt;-r ./myprod_install_root \&lt;br /&gt;-i myprod/install/macosx/Info.plist \&lt;br /&gt;-d myprod/install/macosx/Description.plist&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The .pmproj file is prepared by you, prior to repeated running of this script, by the PackageMaker GUI tool that is in /Developer/Applications/Utilities ...&lt;br /&gt;&lt;br /&gt;Oh, and under myprod_install_root, you first have to create separate Applications, Library etc. folders containing copies of my App, Libraries etc. that you want installed, in a folder structure mirroring how they should get installed on the target Mac.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Windows Mobile&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The solution here is to build cabinet files using cabwiz (which comes with of Visual Studio). You'll need to construct all sorts of custom code in a custom setup.dll file, that does stuff such as displaying license text that the user must agree to at install time. You should also write a relatively simple launcher .exe for Windows Desktop, that allows the user to install the file directly from their Windows desktop, through the services of ActiveSync (this is a lot easier for your users, than expecting them to copy a .cab file across to their Mobile device's StartUp menu...!)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;iPhone&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For distribution to your ad-hoc testers, remember that you need to update the version number in version.plist &lt;span style="font-style: italic;"&gt;every time&lt;/span&gt; you supply an updated build; otherwise, it'll fail to install/update on the target iPhone/iPod! Remember also that if you zip-up a .app file, it won't install properly after being unzipped on the target computer. Instead, first put the .app file in a disk image, and then compress the disk image to a zip file that you can then mail to your ad-hoc testers.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-8907273105465764971?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/8907273105465764971/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=8907273105465764971' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/8907273105465764971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/8907273105465764971'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/07/building-installs.html' title='Building installs'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-4032475003419390305</id><published>2009-07-13T20:49:00.003+01:00</published><updated>2009-07-13T21:00:46.028+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Beyond Compare'/><category scheme='http://www.blogger.com/atom/ns#' term='Mac diff'/><category scheme='http://www.blogger.com/atom/ns#' term='diff'/><category scheme='http://www.blogger.com/atom/ns#' term='Changes'/><title type='text'>File comparison and diff tools - Mac and Windows</title><content type='html'>File comparison tools are pretty critical to what I do. Most of the time, I rely on command-line diff (under Mac Terminal, or Windows Cygwin shell). But there are times when only a graphical comparison tool will do; such as recently, when I changed a vast amount of code, only to have introduced a new bug that was proving very difficult to track down. In these cases, you need to compare old and new code, one file (or folder) at a time, painstakingly looking at each change until you figure-out what went wrong.&lt;br /&gt;&lt;br /&gt;A friend introduced me to &lt;a href="http://www.scootersoftware.com/"&gt;Beyond Compare&lt;/a&gt; for Windows - which I liked enough to buy a license for. Great software!&lt;br /&gt;&lt;br /&gt;However, now that I've changed my focus to do as much of my core development as possible on the Mac (avoiding Parallels where possible as it really is very slow compared to native Mac tools), I've been hunting around for a good graphical diff for Mac. And I have now found that tool - it is called &lt;a href="http://connectedflow.com/changes/"&gt;Changes&lt;/a&gt;. Give it a try - tremendously good value, I'm very pleased to have bought a license!&lt;br /&gt;&lt;br /&gt;Incidentally, I'm quite amazed at how much faster the shell on Mac works compared to Cygwin on Windows. I use a lot of scripting as part of my software development setup; one of the reasons to moving over to doing as much work as possible on the Mac is that the faster scripting makes a big difference to my productivity. I wonder why Cygwin is so much slower than the Mac Terminal window?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-4032475003419390305?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/4032475003419390305/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=4032475003419390305' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/4032475003419390305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/4032475003419390305'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/07/file-comparison-and-diff-tools-mac-and.html' title='File comparison and diff tools - Mac and Windows'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-5930396478914829212</id><published>2009-07-09T07:54:00.004+01:00</published><updated>2009-07-09T10:23:03.362+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android audio sdk'/><title type='text'>More on Android Audio</title><content type='html'>Many thanks to Jay, who was kind enough to post a comment on my previous post, saying that there &lt;span style="font-style:italic;"&gt;is&lt;/span&gt; an API we can use for programmatic delivery of audio streams in Android, which you can find documented at &lt;a href="http://developer.android.com/reference/android/media/AudioTrack.html"&gt;http://developer.android.com/reference/android/media/AudioTrack.html&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Now that I know where to look :), I have found that there is also a similar API you can use to capture incoming audio on Android to memory, which is documented at &lt;a href="http://developer.android.com/reference/android/media/AudioRecord.html"&gt;http://developer.android.com/reference/android/media/AudioRecord.html&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So, that means that Intermorphic could at some point create a Noatikl/Partikl player library for Android if we wanted to, using the &lt;a href="http://developer.android.com/sdk/ndk/1.5_r1/index.html"&gt;Android NDK&lt;/a&gt; (I wouldn't be surprised if this link breaks at some point...).&lt;br /&gt;&lt;br /&gt;However, that would first require the NDK to fill-in some critical (!) gaps:&lt;br /&gt;- no support for C++ exceptions (this is a show stopper for a lot of code...)&lt;br /&gt;- no support for STL (this is also a show stopper...)&lt;br /&gt;&lt;br /&gt;If any reader happens to know who to prod at Android, please get them on the case wrt the holes in their C++ support!&lt;br /&gt;&lt;br /&gt;I suspect that the full Mixtikl user interface would be a bridge too far :) though it'd be interesting to experiment around what is possible (not that I ever have any spare time!).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-5930396478914829212?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/5930396478914829212/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=5930396478914829212' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/5930396478914829212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/5930396478914829212'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/07/more-on-android-audio.html' title='More on Android Audio'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-1833228518699421136</id><published>2009-07-06T09:51:00.003+01:00</published><updated>2009-07-06T15:20:29.598+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android audio sdk'/><title type='text'>Android Audio?</title><content type='html'>I've been investigating Android recenly, and have downloaded the SDK and had a play with it.&lt;br /&gt;&lt;br /&gt;And in summary, I'm quite staggered at how poor the support is for audio in the Android SDK.&lt;br /&gt;&lt;br /&gt;You can find-out more &lt;a href="http://developer.android.com/guide/topics/media/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The fundamental problem is that there is no way for a program to generate its own stream of audio. All audio resources must be from a URI of some sort, or from data bundled-in to the application, or from a file in the file system.&lt;br /&gt;&lt;br /&gt;Of course, some bright spark out there might tell me that you can easily create your own "in-app" audio server with Java that you can access through a URI from that self-same application, and that can generate an audio stream on demand; I'd love to hear if this is the case!&lt;br /&gt;&lt;br /&gt;On another note, the audio data capture system only allows you to send data to a file; there is no way for your application to get access to the audio as it arrives. So whichever way you look at it, there is no way to create audio FX boxes for Android.&lt;br /&gt;&lt;br /&gt;This all reminds me very much of the JSR-135 multimedia APIs for Java, which were completely useless from the perspective of a low-level audio programmer.&lt;br /&gt;&lt;br /&gt;I'm pleased to report however that if you want to create interesting audio apps for Mobile, then your needs are well served both by the iPhone/iPod SDK, and the Windows Mobile SDK. Shame about Android though!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-1833228518699421136?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/1833228518699421136/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=1833228518699421136' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/1833228518699421136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/1833228518699421136'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/07/android-audio.html' title='Android Audio?'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-4371608595797473565</id><published>2009-07-01T12:19:00.002+01:00</published><updated>2009-07-01T12:22:58.199+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iphone mixtikl'/><title type='text'>More Mixtikl progress</title><content type='html'>Well, that always seems to happen. We've decided to put another round of polish on Mixtikl 1.5 for iPhone/iPod, and figure that we'll spend another 4 weeks or so on it, if our estimates are right...!&lt;br /&gt;&lt;br /&gt;Holiday season is coming up too which is bound to affect things! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-4371608595797473565?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/4371608595797473565/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=4371608595797473565' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/4371608595797473565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/4371608595797473565'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/07/more-mixtikl-progress.html' title='More Mixtikl progress'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-1014138961934001782</id><published>2009-06-29T07:53:00.000+01:00</published><updated>2009-06-29T07:56:30.941+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android ndk C++ native jni'/><title type='text'>Android NDK?</title><content type='html'>Interesting to read about the &lt;a href="http://developer.android.com/sdk/ndk/1.5_r1/"&gt;Android NDK&lt;/a&gt;, which is a "native" SDK for Android.&lt;br /&gt;&lt;br /&gt;It is a shame that currently, the implementation seems somewhat flawed IMO:&lt;br /&gt;- your app is written in Java and runs through the VM; you can call-out to native code libraries through JNI (which has hardly efficient!)&lt;br /&gt;- no support for C++ exceptions (this is a show stopper for a lot of code...)&lt;br /&gt;- no support for STL (this is also a show stopper...)&lt;br /&gt;&lt;br /&gt;Reading the forums, the latter 2 are likely to appear some time; goodness only knows if the first restriction will ever disappear...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-1014138961934001782?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/1014138961934001782/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=1014138961934001782' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/1014138961934001782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/1014138961934001782'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/06/android-ndk.html' title='Android NDK?'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-6771465010514753581</id><published>2009-06-26T08:05:00.004+01:00</published><updated>2009-06-26T08:25:51.734+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iphone windows mobile android symbian smartphones applications'/><title type='text'>Is the expanding mobile environment a good thing?</title><content type='html'>Thanks to a response from "Mobile" to my blog from a couple of days back, pointing out that the whole underlying market for Smartphones will continue to expand and diversify.&lt;br /&gt;&lt;br /&gt;It seems pretty clear that most product churn seems to be of little benefit to the consumer. For example: I was pretty happy with Windows 95, and accept that Windows XP is better; but cannot see any point at all in Windows Vista. :) Companies have a need to keep re-inventing successful products, as milking a cash-cow is hugely easier than creating a new one.&lt;br /&gt;&lt;br /&gt;For me, phones have been capable enough for most things since Windows Mobile 2002! That allowed full-featured, multi-threaded applications to be written and deployed in C++; with support out-of-the-box for full-duplex audio. With easy exchange of data through the PC using Active Sync. Devices were cheap, too.&lt;br /&gt;&lt;br /&gt;All that was missing back then was a realisation by the market that such a device was a genuinely capable, multi-purpose mobile computer.&lt;br /&gt;&lt;br /&gt;Since then, I can't see that Windows Mobile has moved on much (although the development tools are now better!); but then it really didn't need to change much, it has been a great platform for a long time. Symbian seems to have stood still for many years, and is stuck with a terrible variant of C++ and an awful tool chain. iPhone has opened a lot of peoples eyes, full credit to Apple for putting their toes in the water and for extending the iPod concept to include iPhone, and for pointing-out a direction for touchable UIs.&lt;br /&gt;&lt;br /&gt;Anyways: to the heart of the problem. Now that more platforms offer similar capabilities - though iPhone has big sandboxing and connectivity issues, Android only allows Java apps, Symbian is a pig to code for and (IIRC) only allows applications to support single-duplex audio - that has served mainly to split-up the market. This gives more choice for the consumer in terms of hardware, but ironically makes it more difficult to get all the software you want on your chosen phone. Should you get a Windows Mobile device for application A, or iPhone for application B, or Symbian for application C? What if you want to change platform? Tough: you probably can't bring all your favourite apps with you. Now this might be good for the hardware developer (locking people in to their platforms), but in my opinion this is bad for the consumer.&lt;br /&gt;&lt;br /&gt;The applications are what really define the device.  You want Halo? You get an XBox. You want Zelda? You get a Wii. If you want Logic, you use a Mac. If you want Microsoft Office, you get a Windows box. Luckily now if you like Open Office, Firefox or other cross-platform tools, you have the option of running on all three main desktop platforms.&lt;br /&gt;&lt;br /&gt;When it comes to smaller apps for mobile devices, the sort which are written by smaller developers and which really are what make a phone do what a user wants, and which are a far simpler proposition that the big apps I've just mentioned, you might think that it should surely be possible to write once, and deploy on all the platforms without too much effort? Actually no: it is unbelievably hard work, as you'll have seen from other posts on my blog.&lt;br /&gt;&lt;br /&gt;The biggest challenge for mobile software developers, is one of writing an app such that it can reach as much of the market as possible. I can't see many ways to make this easy (apart from using a framework like the one we've painstakingly developed at Intermorphic!); this will lead to each phone platform being a separate island. I can but hope that &lt;a href="http://antixlabs.com/"&gt;Antix&lt;/a&gt; will succeeed and open up this whole market... which would also allow apps to be written once in C++, and run with binary portability on any device, including TVs, which had the application engine installed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-6771465010514753581?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/6771465010514753581/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=6771465010514753581' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/6771465010514753581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/6771465010514753581'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/06/is-expanding-mobile-environment-good.html' title='Is the expanding mobile environment a good thing?'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-1850300657531170613</id><published>2009-06-25T08:29:00.006+01:00</published><updated>2009-06-25T08:42:29.198+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mixtikl Bonjour Windows iPhone'/><title type='text'>Sharing data between Mixtikl Windows and Mixtikl iPhone/iPod</title><content type='html'>While waiting for the skins and Tiklpaks for Mixtikl 1.5 to pull-together, I've been continuing to fill-out the outer edges of Mixtikl. I spent the past week adding-in code that allows Mixtikl on Windows to share data with Mixtikl on iPhone/iPod; this was a lot harder than I wanted, as it involved both bonjour code and the creation of a mini HTTP server, which are things you get "out of the box" with XCode for Mac/iPhone, and which are hard to implement on Windows (to say the least!). Still, the code to do the file sharing all now seems to be working and I'll spend a day or 2 more on testing/tweaking it.&lt;br /&gt;&lt;br /&gt;I remain amazed that the iPhone SDK makes it so difficult to share data with the desktop. On Windows Mobile, you can get data on and off via your PC using Active Sync and Windows Explorer; albeit, there is no simple way to get data on/off your Mac (if you have one!) short of installing Windows on your Mac through a VM or Boot Camp. On the iPhone/iPod, your app sits there in its own island, unable to communicate even with a Mac without a large amount of code being written for both Mac and iPhone. And if you want your iPhone/iPod app to communicate with a Windows box, well you're in a world of hurt from a coding perspective.&lt;br /&gt;&lt;br /&gt;The good news for us is that now we've done the hard work, I think we'll be able to quite easily roll-out useful utilities within Mixtikl, that will allow quite a lot useful stuff to be done on iPhone/iPod/Windows Mobile - and shared/worked-on on the PC/Mac, as best suits the needs of the user...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-1850300657531170613?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/1850300657531170613/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=1850300657531170613' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/1850300657531170613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/1850300657531170613'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/06/sharing-data-between-mixtikl-windows.html' title='Sharing data between Mixtikl Windows and Mixtikl iPhone/iPod'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-8244264949934716925</id><published>2009-06-18T07:55:00.005+01:00</published><updated>2009-06-18T08:13:56.822+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='windows mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='Mixtikl'/><category scheme='http://www.blogger.com/atom/ns#' term='webOS'/><category scheme='http://www.blogger.com/atom/ns#' term='Palm'/><category scheme='http://www.blogger.com/atom/ns#' term='Symbian'/><category scheme='http://www.blogger.com/atom/ns#' term='iPod'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Windows Mobile, iPhone, Android, Palm - a look around</title><content type='html'>It is an interesing time of flux in the mobile software development market. The new version of iPhone OS released, a new version of Windows Mobile in the offing, Android phones have trickled onto the market and the Palm Pre arriving. &lt;br /&gt;&lt;br /&gt;Intermorphic are in a pretty good position during this time of change.&lt;br /&gt;&lt;br /&gt;The approach we've taken is to try and embrace all the key platforms - provided they support C++, Posix threads and STL. This lowest common denominator allows us develop complex software quite cost effectively. Of course, this required us to engineer our products from the beginnning to be able to reuse 95+% of our UI code, and 99+% of all other code, across all platforms we support; which is a challenge but one that was well worth the effort. That allows us to create standalone Mixtikl variants for Windows Mobile, iPhone, and Mac/Windows desktops. And even plug-in VSTi/AU variants for Mac/Win desktops!&lt;br /&gt;&lt;br /&gt;This baseline requirement on C++ means that for now, Android and Palm webOS aren't viable target platforms for Mixtikl. The reason? Android only supports Java applications, and Palm Pre supports only JavaScript/CSS applications. However, the C++ approach does mean that a Symbian Series 60 variant of Mixtikl is possible in the future, if the Symbian SDKs ever become cost-effective to use (I remember various past problems when I last looked at Symbian, including their use of non-standard C++, no thread support, no support for STL...). The Antix platform also looks very promising, I hope it gets mass distribution so we can run on it!&lt;br /&gt;&lt;br /&gt;It is interesting to consider how the Android and Palm platforms might succeed in terms of a 3rd party software market. From my perspective as a creator of applications for mobile, I can't see how it could be cost effective for me to invest several months (or years!) in creating a complex app for either Android or Palm, where I could spend just a little more time creating a complex app that would run on all of Windows Mobile, iPhone/iPod, Windows desktop, Mac desktop, and future platforms as yet unknown. The economies of scale seem pretty clear to me. :) I can see small games and utilities being created for the two platforms, but would be surprised to see large-scale commercial apps coming about for either of them.&lt;br /&gt;&lt;br /&gt;Pete&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-8244264949934716925?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/8244264949934716925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=8244264949934716925' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/8244264949934716925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/8244264949934716925'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/06/windows-mobile-iphone-android-palm-look.html' title='Windows Mobile, iPhone, Android, Palm - a look around'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-5547552340813883910</id><published>2009-06-12T07:40:00.003+01:00</published><updated>2009-06-18T08:12:15.038+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mixtikl'/><category scheme='http://www.blogger.com/atom/ns#' term='iPod'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Mixtikl 1.5 gets closer...</title><content type='html'>Another 2 weeks on, and another 2 (or 3!) weeks of coding to go.&lt;br /&gt;&lt;br /&gt;I've put a lot of effort over the past couple of weeks into further polishing Mixtikl on iPod/iPhone, and have also spent time improving the behaviour of Mixtikl on Windows Mobile (which has not been forgotten amongst all the iPhone work!).&lt;br /&gt;&lt;br /&gt;There is still quite a bit of work to do on tweaking the skins for all the different Mixtikl platforms, and we've yet to finalise the Tiklpaks for release; we'll just have to see how we get on and release when we're ready!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-5547552340813883910?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/5547552340813883910/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=5547552340813883910' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/5547552340813883910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/5547552340813883910'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/06/mixtikl-15-gets-closer.html' title='Mixtikl 1.5 gets closer...'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-3339022591719737754</id><published>2009-05-31T15:30:00.003+01:00</published><updated>2009-05-31T15:35:29.393+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mixtikl iPhone'/><title type='text'>Mixtikl iPhone release soon?</title><content type='html'>It sometimes feels like I've been working on Mixtikl for iPhone for my entire life. :)&lt;br /&gt;&lt;br /&gt;Anyways, we've made a great deal of progress over the past months, and are now aiming to submit the app to the App Store in around 4 weeks. Knowing the way things go, we'll no doubt slip by a few weeks, but it is good to have a date to target.&lt;br /&gt;&lt;br /&gt;As for how long it'll take to get the app actually listed on the App Store; well, we'll just have to see what happens!&lt;br /&gt;&lt;br /&gt;We'll also be rolling-out Mixtikl 1.5 to all the other platforms at the same time. Much to do! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-3339022591719737754?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/3339022591719737754/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=3339022591719737754' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/3339022591719737754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/3339022591719737754'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/05/mixtikl-iphone-release-soon.html' title='Mixtikl iPhone release soon?'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-7439989831808865119</id><published>2009-05-25T14:49:00.007+01:00</published><updated>2009-05-25T15:15:09.859+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Parallels Windows XP Mac OS Visual Studio Open Office Firefox Spaces'/><title type='text'>Parallels 4</title><content type='html'>Last week, I help my brother configure his new Mac Book Pro. On this, we installed Parallels, so he can use Windows XP easily without rebooting from Mac; and sometimes when booted directly into Windows (mainly, for using legacy Windows Audio tools where he wanted minimum audio latency). The whole idea behind this is to help him transition to doing more work on Mac and less under Windows...&lt;br /&gt;&lt;br /&gt;I was a bit worried about installing Parallels, having previously had real problems with it; but his installation went fine, and all seems to be working well. Actually, the performance is pretty impressive!&lt;br /&gt;&lt;br /&gt;Things went wrong for me a while back when I had Parallels 2; using this, my Windows partition got corrupted pretty early on, so I gave up and moved to a BootCamp solution. I got the Parallels 3 upgrade when it came out, so that I could try to use my Boot Camp partition with Parallels; but this also corrupted Windows for some reason, leading to yet another re-installation and dumping of Parallels. Well, as my brothers installation of Parallels 4 had gone well, I decided to try yet again..!&lt;br /&gt;&lt;br /&gt;I bought the upgrade from Parallels 3 to Parallels 4, and converted the BootCamp on my wife's Mac Book to use Parallels (figuring it best to try on her Mac, rather than my main development Mac!). This went well; so I took the plunge and converted my Boot Camp on my Mac Book Pro using a new (non-upgrade) Parallels 4; this also went well. Phew! :)&lt;br /&gt;&lt;br /&gt;However... I then found that I'd installed Parallels for Boot Camp slightly wrong for my wife's machine, and had to track-down instructions on how to enable parallels for her when logged on as her (not just when logged-on as me!). The solution was a pain, and required me to change her account to be an admin account (something that is not documented in the instructions I followed...); but at least it all works now and she can do most of her work now in Mac OS!&lt;br /&gt;&lt;br /&gt;You might wonder why I went through all this hassle. The primary reasons are that Mac OS is a lot faster to start-up, and the battery lasts longer in MacOS. I have to do a lot of development work in Mac OS and Windows; and it is a pain to have to reboot between the two; so if I can use Mac OS has my main base, and use Windows whenever I need to, then that saves me a lot of time week-by-week. In the case of my wife, she needs to use Windows for only one thing, which is some Internet Explorer magic to do access her office network. We have found that Open Office 3.1 now lets her open and edit all of her work-related documents, without the need for Microsoft Windows; and she can work the same way in both MacOS and Windows.&lt;br /&gt;&lt;br /&gt;It seems that in the main, the tools that most people use most often are the web browser and office tools. We use Firefox for both Windows and Mac, and Open Office for both Windows and Mac; so the operating system is less relevant. This brings me back to secondary issues of speed of start-up and longer battery life; where the Mac wins.&lt;br /&gt;&lt;br /&gt;I was also pretty impressed to find that even when booted into Mac OS, running Windows XP in the Parallels VM, I can use Visual Studio 2007 running Mixtikl in a Windows Mobile emulator, debugging real-time audio code without any audio break-up. That is partly because my Mac Book Pro is pretty fast, and also because Parallels 4 really does seem to offer great performance. I wonder when I'll next feel the need to boot-up via Boot Camp?&lt;br /&gt;&lt;br /&gt;One more reason for using Windows XP under the Parallels VM, is that just last week I discovered the wonderful Spaces mode in Mac OS, which gives me a dead-easy to use Virtual Desktop. This works brilliantly for me, and has already transformed my development process. There is no build-in virtual windowing mode that I can see in Windows XP, which has long frustrated me... anyways, Spaces also works very well with an external monitor, and/or when using Windows via the Parallels VM. Great software!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-7439989831808865119?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/7439989831808865119/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=7439989831808865119' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/7439989831808865119'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/7439989831808865119'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/05/parallels-4.html' title='Parallels 4'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-4408916747852486942</id><published>2009-05-14T00:07:00.007+01:00</published><updated>2009-06-01T08:25:34.749+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone performSelectorOnMainThread'/><title type='text'>Running iPhone UI code from other than the main thread</title><content type='html'>If you've got a relatively complex multi-threaded app, where you need to have something happen in the UI in response to an event occuring in a thread &lt;span style="font-weight:bold;"&gt;that is not the main thread&lt;/span&gt;, then you're going to have to be careful!&lt;br /&gt;&lt;br /&gt;Basically, what you need to do is use &lt;span style="font-style:italic;"&gt;performSelectorOnMainThread&lt;/span&gt; to execute your code that does UI work; as otherwise the UI calls you make will probably cause your iPhone app to crash!&lt;br /&gt;&lt;br /&gt;The way to do this is to create an instance of an Objective-C++ (or C!) wrapper class that has a method on it which'll do the UI work for you (and could well have a modal loop within it, like for yesterday's post). That method could be something simple, like:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;- (void)DoTheUiStuff&lt;br /&gt;{&lt;br /&gt;  // All the UI code is here&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Derive this class from NSObject (or maybe UIView, of course!).&lt;br /&gt;&lt;br /&gt;You can then invoke this method through a selector, passed to your call on your class instance to performSelectorOnMainThread. When this call returns, you're safe to clean-up your wrapper class instance and get back to whatever your thread was up to in the first place...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-4408916747852486942?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/4408916747852486942/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=4408916747852486942' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/4408916747852486942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/4408916747852486942'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/05/running-iphone-ui-code-from-diffferent.html' title='Running iPhone UI code from other than the main thread'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-3805302439718274997</id><published>2009-05-13T11:19:00.005+01:00</published><updated>2010-03-01T08:44:52.873Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone UIAlertView UIAlertViewDelegate modal'/><title type='text'>Running a UIAlertView modally</title><content type='html'>The funny thing about UIAlertView (and other iPhone modal interfaces), is that they don't actually run modally; in other words, you can't do something simple like this:&lt;br /&gt;&lt;pre&gt;bool bResult = [myUIAlertView runModal];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Rather, the UIAlertView has a show method ... which shows the dialog, but which doesn't simply hang around and give you a result when done.&lt;br /&gt;&lt;br /&gt;What you need to do in this situation, is create a delegate to handle the message generated when the UIAlertView button is pressed; and you must then provide you own modal processing loop!&lt;br /&gt;&lt;br /&gt;Here is a simplified version of what you need to do. Spot the code loop that makes it all run modally!&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;// Create an instance of a custom UIAlertViewDelegate that we use to capture&lt;br /&gt;// the events generated by the UIAlertView&lt;br /&gt;MyUIAlertViewDelegate *lpDelegate = [[MyUIAlertViewDelegate alloc] init];&lt;br /&gt;&lt;br /&gt;// Construct and "show" the UIAlertView (message, title, cancel, ok are all&lt;br /&gt;// NSString values created earlier in your code...)&lt;br /&gt;UIAlertView *lpAlertView = [[UIAlertView alloc] initWithTitle:title message:message delegate:lpDelegate cancelButtonTitle:cancel otherButtonTitles:ok,nil];&lt;br /&gt;&lt;br /&gt;[lpAlertView show];&lt;br /&gt;&lt;br /&gt;// Run modally!&lt;br /&gt;// By the time this loop terminates, our delegate will have been called and we can&lt;br /&gt;// get the result from the delegate (i.e. what button was pressed...)&lt;br /&gt;while ((!lpAlertView.hidden) &amp;&amp; (lpAlertView.superview!=nil))&lt;br /&gt;{&lt;br /&gt;[[NSRunLoop currentRunLoop] limitDateForMode:NSDefaultRunLoopMode];&lt;br /&gt;MySleepMilli(10);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Grab the result from our delegate (via a custom property)&lt;br /&gt;int nResult = [lpDelegate result];&lt;br /&gt;&lt;br /&gt;// Tidy up!&lt;br /&gt;[lpAlertView release];&lt;br /&gt;[lpDelegate release];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Hope that helps!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-3805302439718274997?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/3805302439718274997/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=3805302439718274997' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/3805302439718274997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/3805302439718274997'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/05/running-uialertview-modally.html' title='Running a UIAlertView modally'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-7923009054559350897</id><published>2009-05-12T09:15:00.005+01:00</published><updated>2009-05-14T07:53:49.021+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vim MRU'/><title type='text'>Vim - easy to install MRU list</title><content type='html'>If you want an MRU list in your vim window for Windows/Linux (which is very useful, trust me!) then simply follow the instructions you'll find here to install a really useful Vim plug-in:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.vim.org/scripts/script.php?script_id=521"&gt;mru.vim : Plugin to manage Most Recently Used (MRU) files&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This works very well with with the  vims I've tried it on so far, which are gvim and cygwin vim on Windows, console-based vim and gvim on Linux, as well as console vim and MacVim on the Mac.&lt;br /&gt;&lt;br /&gt;Even though an MRU system of sorts is already built-in to MacVim, I still recommend using this vim plug-in as it also works very well with MacVim.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-7923009054559350897?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/7923009054559350897/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=7923009054559350897' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/7923009054559350897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/7923009054559350897'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/05/vim-easy-to-install-mru-list.html' title='Vim - easy to install MRU list'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-175068821657210466</id><published>2009-05-10T15:06:00.004+01:00</published><updated>2009-05-13T11:19:10.858+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iphone ad-hoc version upgrade xcode compress &quot;disk utility&quot;'/><title type='text'>iPhone Ad Hoc Distribution gotcha</title><content type='html'>Here is a good one - if you forget to update the version number in your iPhone app (through the info.plist file): and then try to install the App to your iPod/iPhone as an Ad Hod distribution, iTunes will prompt you to upgrade your app; but will actually fail to upgrade the app at all. :)&lt;br /&gt;&lt;br /&gt;In this case, you could either first delete the app and re-install (but this would lose any app-specific data of course); or re-build with a new version number!&lt;br /&gt;&lt;br /&gt;On another note, if you try to just zip-up your app with the Compress feature in Finder, and send that - it won't capture enough information, and will fail to install on your ad-hoc target devices. Instead, you should copy your app file to a folder, use Disk Utility to create a DMG file from that folder, and then zip-up the DMG file; and send that on to your testers. That will work. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-175068821657210466?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/175068821657210466/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=175068821657210466' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/175068821657210466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/175068821657210466'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/05/iphone-ad-hoc-distribution-gotcha.html' title='iPhone Ad Hoc Distribution gotcha'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-2826209929107724736</id><published>2009-05-08T08:58:00.004+01:00</published><updated>2009-05-08T09:14:46.811+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bonjour iphone mac mixtikl'/><title type='text'>iPhone - clearing the Bonjour jungle</title><content type='html'>Phew: the Mixtikl file sharing code seems to be pretty much sorted out now. It has been a lot of work, but it is great to be able to have Mixtikl on the Mac share files with Mixtikl on the iPhone (in both directions!) through the local network.&lt;br /&gt;&lt;br /&gt;I like the way that you can copy a Tiklpak from Mixtikl on your Mac, to Mixtikl on the iPhone, and use it immediately on your iPhone without having to restart. Nifty!&lt;br /&gt;&lt;br /&gt;I can now get back to tidying-up the skin code to accomodate Tim's latest design. And when that is done: we'll be in a position to submit Mixtikl 1.5 to the App Store...&lt;br /&gt;&lt;br /&gt;Just for the record though, if the iPhone allowed the desktop machine to connect to the iPhone, such that the desktop could read/write data into an "public" area specific to each app; that would have made everybody's lives so much easier without breaking the sandbox model.&lt;br /&gt;&lt;br /&gt;The approach taken in Windows Mobile is much more flexible - just copy files around as you want, using Explorer and Active Sync ... though of course the fact that Mixtikl for iPhone has an integrated solution will make it really easy for Mixtikl users with a Mac. Windows users with an iPhone will not find things so easy though...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-2826209929107724736?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/2826209929107724736/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=2826209929107724736' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/2826209929107724736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/2826209929107724736'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/05/iphone-clearing-bonjour-jungle.html' title='iPhone - clearing the Bonjour jungle'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-6751171528486559907</id><published>2009-05-03T20:26:00.006+01:00</published><updated>2009-05-14T07:54:37.082+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone Objective-C Objective-++ Cocoa Bonjour'/><title type='text'>Fun with Bonjour and NSRunLoop</title><content type='html'>You know, I keep coming back to not liking much of the implementation behind Cocoa, no matter how much I use it!&lt;br /&gt;&lt;br /&gt;Here is the sort of thing that irritates me. I create a dialog within Mixtikl (using our own internal GUI framework), and run it modally. Within that Dialog, I use Cocoa services to request to be told what Bonjour-advertised services are available. What do I get? Well, nothing, other than a call through the delegate to tell me that searching has started.&lt;br /&gt;&lt;br /&gt;It turns out that the processing behind the scenes works only if the active NSRunLoop is allowed to do processing; so I've had to add-in a call like this in my modal loop:&lt;br /&gt;    &lt;br /&gt;&lt;code&gt;&lt;br /&gt;    [[NSRunLoop currentRunLoop] limitDateForMode:NSDefaultRunLoopMode];&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;So you might ask, what is wrong with this? I contend that for such processing, the system should be smarter and use an approach that doesn't require specific magic within the client code (in this case, a worker thread that does the work without my having to worry about blocking it). Otherwise, people who know a lot less than me might never be able to figure-out what they've done wrong.&lt;br /&gt;&lt;br /&gt;Bonjour is a great idea, and is built-in to Mac/iPhone: however, I can't spot any open-source implementation that I can use for other platforms. If any reader would be kind enough to point me to such an implementation, I'd love to take a look!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-6751171528486559907?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/6751171528486559907/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=6751171528486559907' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/6751171528486559907'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/6751171528486559907'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/05/fun-with-bonjour-and-nsrunloop.html' title='Fun with Bonjour and NSRunLoop'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-7330818002551391559</id><published>2009-04-27T13:31:00.006+01:00</published><updated>2009-04-27T21:48:21.970+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone Objective-C Objective-++ Cocoa'/><title type='text'>Objective C++ and file extensions (.m, .mm, .cpp)</title><content type='html'>If you've ever wondered how to combine C++ and C in your Cocoa code for iPhone or Mac, it is as simple as renaming your files to have a .mm extension, rather than the default .m extension.&lt;br /&gt;&lt;br /&gt;It is a shame that Apple don't enable this file extension by default in their code building wizards. It certainly makes the transition to Objective C for C++ programmers a lot easier!&lt;br /&gt;&lt;br /&gt;Anyways, for those of you interested in porting your C++ code across to iPhone and Cocoa, without having to rename your files or create lots of .mm file wrappers; I discovered under Linux that &lt;i&gt;-x objective-c++&lt;/i&gt; can be used to tell the compiler to treat the file as an objective c++ file; irrespective of the file extension... as follows (wbere test.cpp actually contains Objective-C++ syntax, and would normally be called test.mm ...):&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;gcc-4 &lt;i&gt;-x objective-c++&lt;/i&gt; test.cpp -lgcc -lobjc -o a.exe -lc -lstdc++&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;There are two ways to use this in XCode:&lt;br /&gt;- on file-by-file basis, right-click on any .cpp file in which you want to put some Objective-C and/or C++, and select &lt;i&gt;Get Info&lt;/i&gt;. In the &lt;i&gt;Build&lt;/i&gt; tab, set  &lt;b&gt;-x objective-c++&lt;/b&gt; in the Additional Compiler Flags field.&lt;br /&gt;- alternatively, for the entire project, in Project Settings under Build, under &lt;i&gt;GCC 4.0 - Language&lt;/i&gt;, set &lt;i&gt;Compile Sources As&lt;/i&gt; to &lt;b&gt;Objective-C++&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;As always; this is easy when you know how...!&lt;br /&gt;&lt;br /&gt;Pete&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-7330818002551391559?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/7330818002551391559/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=7330818002551391559' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/7330818002551391559'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/7330818002551391559'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/02/objective-c.html' title='Objective C++ and file extensions (.m, .mm, .cpp)'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-2896678841173503572</id><published>2009-04-25T15:03:00.001+01:00</published><updated>2009-05-12T08:09:43.626+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CFSocketCreate iPhone ipv6 ipv4'/><title type='text'>CFSocketCreate on iPhone</title><content type='html'>If you're doing sockets programming on your iPhone (like I'm doing for Mixtikl's file sharing server code), don't panic when your call to &lt;i&gt;CFSocketCreate&lt;/i&gt; fails to create an IPv6 TCP socket when passing &lt;i&gt;PF_INET6&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Just accept the IPv4 socket that you will get when passing-in &lt;i&gt;PF_INET&lt;/i&gt;, and all will be fine... :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-2896678841173503572?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/2896678841173503572/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=2896678841173503572' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/2896678841173503572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/2896678841173503572'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/04/cfsocketcreate-on-iphone.html' title='CFSocketCreate on iPhone'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-3384913995749303369</id><published>2009-04-25T14:59:00.004+01:00</published><updated>2009-05-12T08:09:18.828+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='macvim xcode vim'/><title type='text'>MacVim and XCode</title><content type='html'>XCode no longer automatically launches MacVim to edit my files. However, this actually forced me to find what I think is a better solution. :)&lt;br /&gt;&lt;br /&gt;All you need to do is open-up MacVim and XCode; and drag any files you want to edit from the XCode project window file list, on to MacVim. The file you drag-across opens automatically in a new tab for editing under MacVim. Really easy!&lt;br /&gt;&lt;br /&gt;Even more easily: if you are editing a file in XCode, and don't want the hassle of first searching for it in the project file list in order to drag it to XCode; simply right-click on the XCode editor window, select the option to Reveal in Finder, and then right-click on the file in the Finder window and select the option to edit with Vim.app ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-3384913995749303369?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/3384913995749303369/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=3384913995749303369' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/3384913995749303369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/3384913995749303369'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/04/macvim-and-xcode.html' title='MacVim and XCode'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-3287503429902847131</id><published>2009-04-24T12:22:00.001+01:00</published><updated>2009-04-24T14:31:13.468+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CGContextSelectFont CGContextSetFontSize iPhone'/><title type='text'>CGContextSelectFont - slow slow slow...</title><content type='html'>Wow, that was a shock. There I was profiling Mixtikl on the iPhone after tuning various things, and what do I find? CGContextSelectFont is hogging 30% of the CPU cycles!&lt;br /&gt;&lt;br /&gt;This is nothing new apparently (see &lt;a href="http://www.manton.org/2005/12/cgcontextselectfont.html"&gt;http://www.manton.org/2005/12/cgcontextselectfont.html&lt;/a&gt; - which dates from 2005!). Thanks Apple. :-(&lt;br /&gt;&lt;br /&gt;The solution was this:&lt;br /&gt;- when you grab a CGContextRef from UIView (or for example when I create my own singleton temporary one I use for off-line calculation of text display areas...), set the font just once on that CGContextRef by calling &lt;i&gt;CGContextSelectFont&lt;/i&gt; with a temporary font size of e.g. 10; do this before you do &lt;b&gt;any&lt;/b&gt; text drawing operations with the CGContextRef...!&lt;br /&gt;- Whenever you need to draw text, call &lt;i&gt;CGContextSetFontSize&lt;/i&gt; before you call &lt;i&gt;CGContextShowText&lt;/i&gt; (or whatever...); do &lt;b&gt;not&lt;/b&gt; call CGContextSelectFont as there is no need to set the font by name &lt;b&gt;and&lt;/b&gt; size in most cases, just the font size. Calls to CGContextSetFontSize hardly take any time at all ... and your performance problems will disappear.&lt;br /&gt;&lt;br /&gt;That makes a huge difference to performance, and is easy to do when you know how. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-3287503429902847131?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/3287503429902847131/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=3287503429902847131' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/3287503429902847131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/3287503429902847131'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/04/cgcontextselectfont-slow-slow-slow.html' title='CGContextSelectFont - slow slow slow...'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-5205066482802515532</id><published>2009-04-23T22:42:00.000+01:00</published><updated>2009-04-24T12:27:46.358+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mixtikl iPhone'/><title type='text'>Tweaking Mixtikl on the iPhone</title><content type='html'>While Tim is fiddling-away with the new iPhone skin (there's no point in rushing him, he only ignores me anyways ... just joking Tim!), I've been spending my time tweaking the UI responsiveness of Mixtikl on the iPhone, and fixing some odd bugs left-over from the porting process.&lt;br /&gt;&lt;br /&gt;User interface latency is really fabulous ... so much better than Windows Mobile.&lt;br /&gt;&lt;br /&gt;Our pluggable font engine has paid dividends yet again, the effort to move text display across to iPhone was only the matter of a few hours work, as is usual for our trans-platform graphics architecture. It sometimes amazes me when things like this work so quickly, but I guess I shouldn't be surprised any more. :)&lt;br /&gt;&lt;br /&gt;I have few other bits-and-bobs to sort out, but things are looking and sounding very good indeed...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-5205066482802515532?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/5205066482802515532/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=5205066482802515532' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/5205066482802515532'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/5205066482802515532'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/04/tweaking-mixtikl-on-iphone.html' title='Tweaking Mixtikl on the iPhone'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-5433519729392021633</id><published>2009-04-23T11:06:00.000+01:00</published><updated>2009-04-24T12:28:13.349+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux gcc nm mangling mangled'/><title type='text'>Missing symbol with mangled name when loading a library under Linux? How to track it down.</title><content type='html'>Suffering from a missing with a mangled name when loading a library under Linux? Here is how you can track down what is missing.&lt;br /&gt;&lt;br /&gt;I had a library failing to load...&lt;br /&gt;&lt;br /&gt;The error output reported a "symbol lookup error" for a mangled name like _Zkasdfkadf83 ... which didn't help me much. :)&lt;br /&gt;&lt;br /&gt;To figure-out what this is:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;cd [the folder with your libraries in]&lt;br /&gt;grep  Zkasdfkadf83 *.so &lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;... This tells you the library that the symbol is referred to from.&lt;br /&gt;Assume this is fred.so&lt;br /&gt;&lt;br /&gt;Then, do this. Note: the first version shows you the mangled names, the second version shows you the UNMANGLED (i.e. human readable) names... Other than that, they are identical.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;nm -B fred.so &gt; sym.mangled&lt;br /&gt;nm -C fred.so &gt; sym.unmangled&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Edit both files.&lt;br /&gt;Look for the missing symbol in the first file, make note of the line number.&lt;br /&gt;Go to that line in the second file. That shows you the unmangled-name corresponding to the mangled name. It should now be crystal-clear what the missing symbol is!&lt;br /&gt;&lt;br /&gt;HTH&lt;br /&gt;&lt;br /&gt;Pete&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-5433519729392021633?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/5433519729392021633/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=5433519729392021633' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/5433519729392021633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/5433519729392021633'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/04/missing-symbol-with-mangled-name-when.html' title='Missing symbol with mangled name when loading a library under Linux? How to track it down.'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-1604940236145511272</id><published>2009-04-21T23:32:00.001+01:00</published><updated>2009-04-24T12:28:34.381+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vim gvim viemu macvim'/><title type='text'>The power of Vim</title><content type='html'>I don't often post on tools, but I thought I'd make a mention for some fabulous new software I discovered and installed today:&lt;br /&gt;- ViEmu: a Vim editor plug-in for Microsoft Visual Studio, which integrates really well within Visual Studio and is a bargain IMO ... &lt;a href="http://www.viemu.com/index.html"&gt;http://www.viemu.com/index.html&lt;/a&gt; &lt;br /&gt;- MacVim ... &lt;a href="http://code.google.com/p/macvim/"&gt;http://code.google.com/p/macvim/&lt;/a&gt; - a wonderful version of Vim for Mac, which works quite well with XCode. And it is free!&lt;br /&gt;&lt;br /&gt;I've been a power Vim user for many years now, having first started using vi around 20 years or so back. The key for me is that whatever programming work I have done, on every single platform (apart from VMS - shudder!) I've been able to use one vi variant or other as an ultra-productive editor.&lt;br /&gt;&lt;br /&gt;vi and Vim have been staples of mine on Windows for ages, mainly in the context of cygwin on Windows. I've been using gvim for Windows for a long time now, and it works quite well with Visual Studio; but the ViEmu/VS is such a great integrated solution that I simply wish I'd heard about it years ago - I hate to think how many hours of programming time it would have saved me. :)&lt;br /&gt;&lt;br /&gt;On MacOS X, I naturally use vim from the terminal window (this has been built-in to all Macs for ages). But MacVim is a great implementation, and hooks-in an awful lot better to XCode. Again, I wish that I'd installed it a long time back. It is going to save me a huge amount of time going forward.&lt;br /&gt;&lt;br /&gt;I should note that while there are some good points about both the editors in XCode and Visual Studio, they are both staggeringly less productive to use for every day editing than Vim. When you consider the amount of cross-platform coding I do, I simply can't afford to specialise in either of these two editors. I need one common editing paradigm that rocks for all platforms. So for me, great implementations of Vim on Windows and Mac, that integrate well with Visual Studio and XCode respectively, are tremendously important.&lt;br /&gt;&lt;br /&gt;I also spent some time today learning about some features of Vim that I simply didn't know about, that are going to transform my editing life. Visual selection modes, anybody? :)&lt;br /&gt;&lt;br /&gt;Finally, if you're a serious programmer and haven't tried Vim - go for it. Take the pain of 2 weeks learning curve, get touch-typing and begin to feel the force. :) Vim is free, and you can get it from &lt;a href="http://www.vim.org/"&gt;http://www.vim.org/&lt;/a&gt; for most platforms, or within &lt;a href="http://www.cygwin.org/"&gt;Cygwin&lt;/a&gt; for Windows. It is also built-in to MacOS X and Linux.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-1604940236145511272?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/1604940236145511272/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=1604940236145511272' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/1604940236145511272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/1604940236145511272'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/04/power-of-vim.html' title='The power of Vim'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-8248403284464106424</id><published>2009-04-17T11:54:00.000+01:00</published><updated>2009-04-17T12:07:33.766+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone Mixtikl Tiklpaks Partikl'/><title type='text'>Mixtikl on iPhone - dealing with chubby fingers</title><content type='html'>We're taking our time to get the iPhone version of Mixtikl "just right".&lt;br /&gt;&lt;br /&gt;After playing around with Mixtikl on a real device, it became obvious that the general inaccuracy that you get with touch-only devices using chubby fingers :) meant that the Mixtikl skin needed to be "chunkier". This is as opposed to pointer-controllable devices like most Windows Mobile PDAs, where you can have a UI that supports smaller elements that can be selected accurately with a pointer device.&lt;br /&gt;&lt;br /&gt;We've come up with a nice solution to this problem, and in the interim have been  extending the underlying .partikl file format to take better advantage of local sample files (in Ogg and DLS format) used in the Tiklpaks. All will become clear when we release the next version of Mixtikl!&lt;br /&gt;&lt;br /&gt;These changes are combined with other user-interface tweaks, which we think make a great deal of difference to the usability of Mixtikl across all our platforms.&lt;br /&gt;&lt;br /&gt;We can't wait to release this new version ... but won't rush it. :)&lt;br /&gt;&lt;br /&gt;Pete&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-8248403284464106424?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/8248403284464106424/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=8248403284464106424' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/8248403284464106424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/8248403284464106424'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/04/mixtikl-on-iphone-dealing-with-chubby.html' title='Mixtikl on iPhone - dealing with chubby fingers'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-3544752191902612711</id><published>2009-03-30T21:50:00.000+01:00</published><updated>2009-03-30T21:59:09.168+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone XCode Mixtikl'/><title type='text'>Running Mixtikl on my iPhone</title><content type='html'>At long last, Intermorphic's iPhone SDK application has been activated, we've got our certificate, and we've got Mixtikl running on my iPhone! Exciting times... :)&lt;br /&gt;&lt;br /&gt;Sound quality is great, the UI is responsive and things are looking good. :-)&lt;br /&gt;&lt;br /&gt;It'll be fun getting Mixtikl tidied-up for the iPhone; Tim's already created a great new iteration of the skin that we'll release first for the current platforms (Windows, Mac, and Windows Mobile). We've also been generally improving the workflow and usability of Mixtikl, and will be using the reworked Mixtikl as the basis for some neat demo videos.&lt;br /&gt;&lt;br /&gt;We hope to be in a position to submit Mixtikl to the App Store in the next 3 months or so, but time will tell...! We certainly don't intend to release it until we're totally happy that it offers a polished iPhone experience.&lt;br /&gt;&lt;br /&gt;Pete&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-3544752191902612711?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/3544752191902612711/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=3544752191902612711' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/3544752191902612711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/3544752191902612711'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/03/mixtikl-on-iphone.html' title='Running Mixtikl on my iPhone'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-5065601145576720648</id><published>2009-03-16T13:12:00.000Z</published><updated>2009-03-30T21:58:22.141+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone JavaScript JavaScriptCore'/><title type='text'>JavaScriptCore and iPhone</title><content type='html'>I'm really surprised that while Apple use &lt;a href="http://www.opensource.apple.com/darwinsource/iPhone/"&gt;JavaScriptCore&lt;/a&gt; within the iPhone platform, they don't expose it to application developers (even though it is &lt;a href="http://developer.apple.com/documentation/Carbon/Reference/WebKit_JavaScriptCore_Ref/index.html#//apple_ref/doc/framework/javascriptcore_fw"&gt;available to Mac Desktop developers&lt;/a&gt;!. That seems very last century. :)&lt;br /&gt;&lt;br /&gt;Application development can be a lot quicker when using scripting approaches, but the SDK only allows you to use scripting technologies provided by Apple. I really hope Apple expose the JavaScriptCore engine in the next update to iPhone, that should unlock a whole lot more creative Apps for the iPhone platform.&lt;br /&gt;&lt;br /&gt;Meanwhile, we're continuing to use Lua within the Intermorphic applications for Mac/Windows desktop and Windows Mobile. I've recently been evaluating JavaScriptCore and &lt;a href="http://www.mozilla.org/js/spidermonkey/"&gt;SpiderMonkey&lt;/a&gt;, with a view to using JavaScipt as an alternative to Lua for our applications and engines. The reason? Mainly that a lot more people are familiar with JavaScript than Lua! Reasons not to? Mainly down to licensing pain. And Lua is a great scripting language; Lua is actually very similar to JavaScript.&lt;br /&gt;&lt;br /&gt;Is it just me, or were the GPL licenses designed to be some kind of IP virus?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-5065601145576720648?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/5065601145576720648/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=5065601145576720648' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/5065601145576720648'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/5065601145576720648'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/03/javascriptcore-and-iphone.html' title='JavaScriptCore and iPhone'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-3328367552807109628</id><published>2009-02-19T21:21:00.001Z</published><updated>2009-05-14T07:56:28.676+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone XCode'/><title type='text'>iPhone Interface Builder madness...</title><content type='html'>Hi!&lt;br /&gt;&lt;br /&gt;I've been meaning to mention this for a while... and this has just happened to me &lt;b&gt;again&lt;/b&gt; I guess the time is as good as any to mention it!&lt;br /&gt;&lt;br /&gt;Basically: if you use XCode to create a New Project, based on &lt;i&gt;Tab Bar Application&lt;/i&gt;... as soon as you try adding some items with activated UIAction responders, you're going to get an exception like this when starting the app... which is not a good thing. :)&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;'NSUnknownKeyException', reason: '[&lt;UIViewController 0x44eea0&gt; setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key ....'&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;When this happens, you're the victim of a really stupid bug in Interface Builder/Cocoa.&lt;br /&gt;&lt;br /&gt;I wonder if this sort of problem is enough to put-off novice developers from using Interface Builder... that would be a shame.&lt;br /&gt;&lt;br /&gt;Anyways: the solution to this problem is as follows...&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;From Interface Builder, select MainWindow.xib&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Within the Tab Bar Controller, select each of the two View Controller items in turn... and for each one:&lt;br /&gt;  &lt;ol&gt;&lt;br /&gt;  &lt;li&gt;Press Cmd-2&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;In the window that appears, click on the right-most button with a (i) mark on it&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;... and in the &lt;i&gt;Class&lt;/i&gt; combo box, specifiy the class to be &lt;i&gt;FirstViewController&lt;/i&gt;... (the two items are both wrongly set to be &lt;i&gt;UIViewController&lt;/i&gt;!)&lt;/li&gt;&lt;br /&gt;  &lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt;Save your XIB file, rebuild the system, and all will then work!&lt;br /&gt;&lt;br /&gt;The above steps are explained (obliquely!) here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://discussions.apple.com/thread.jspa?threadID=1598422"&gt;Very basic problem with Tab Bar Application and Interface Builder&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;What surprises me is how little Apple fans complain about hideous bugs like this. :)&lt;br /&gt;&lt;br /&gt;Pete&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-3328367552807109628?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/3328367552807109628/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=3328367552807109628' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/3328367552807109628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/3328367552807109628'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/02/iphone-interface-builder-madness.html' title='iPhone Interface Builder madness...'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-1220310262054084789</id><published>2009-01-25T21:32:00.000Z</published><updated>2009-03-04T08:09:21.068Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Noatikl'/><title type='text'>Back to Noatikl!</title><content type='html'>&lt;a href='http://www.intermorphic.com'&gt;&lt;br /&gt;&lt;img src="http://www.intermorphic.com/images/logos/Intermorphic_Noatikl_trans_generative_music_engine_and_tool_replacing_sseyo_koan_logo_x100.gif" alt="Noatikl Logo" border="0"/&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now that the first release of Mixtikl has settled-down nicely (with an iPhone port hopefully pending, subject to feedback from Apple), we're starting to look again at Noatikl.&lt;br /&gt;&lt;br /&gt;The first thing to sort-out is to make it easier to use templates, and we've just updated Noatikl to version 1.5.0.15 to deal with that. It is now really, really easy to merge Noatikl pieces and templates together.&lt;br /&gt;&lt;br /&gt;The next thing we'll be looking at is some big stuff for Noatikl 2: mainly the generative pattern editor, which is a big chunk of work, and is something that is going to take a lot of focus from us over the coming months. We might also spend some time looking at easy-to-use interfaces for the Noatikl engine for mobile. Whatever we do, we're planning on having some real fun with our generative music engine!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-1220310262054084789?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/1220310262054084789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=1220310262054084789' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/1220310262054084789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/1220310262054084789'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/01/back-to-noatikl.html' title='Back to Noatikl!'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-4781508154618668716</id><published>2009-01-11T22:32:00.000Z</published><updated>2009-03-04T08:46:34.818Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone XCode Cocoa'/><title type='text'>iPhone and Bonjour file sharing</title><content type='html'>I've finally figured-out how to share files between my iPhone running &lt;a href="http://www.intermorphic.com/tools/mixtikl/index.html"&gt;Mixtikl&lt;/a&gt;, and other devices connected to the local network using Wi-Fi. Though it is a lot more work that it should be. :)&lt;br /&gt;&lt;br /&gt;The way to do it was for Mixtikl to run as a HTTP server which broadcasts it's presence using &lt;a href="http://en.wikipedia.org/wiki/Bonjour_(software)"&gt;Bonjour&lt;/a&gt; (see Apple's &lt;a href="http://developer.apple.com/samplecode/CocoaHTTPServer/index.html"&gt;CocoaHTTPServer&lt;/a&gt; example to get you started!), and then you can browse for and grab files from it (e.g. saved .mixtikl or .partikl files) using Safari from any browser on your network! From Safari, select Bookmarks -&gt; Show All Bookmarks, and click on the Bonjour tab. There is a Mixtikl entry from every Mixtikl iPhone on the local network; double-click on it to show the list of files on the iPhone, and select/save the files you want to your Mac!&lt;br /&gt;&lt;br /&gt;The other way around, you're able to use Mixtikl on the iPhone to see files advertised by Mixtikl on the Mac (which also runs a HTTP server advertised using Bonjour); Mixtikl has a special view allowing you to select the server to use, look at the file list, and select the file(s) you want to copy-across to your iPhone.&lt;br /&gt;&lt;br /&gt;Cool stuff; welcome to the &lt;a href="http://en.wikipedia.org/wiki/Zeroconf"&gt;Zeroconf&lt;/a&gt; revolution! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-4781508154618668716?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/4781508154618668716/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=4781508154618668716' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/4781508154618668716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/4781508154618668716'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/01/iphone-and-bonjour-file-sharing.html' title='iPhone and Bonjour file sharing'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-3420516692253202520</id><published>2009-01-05T22:23:00.000Z</published><updated>2009-01-05T22:53:24.587Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mixtikl'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Porting Mixtikl to iPhone</title><content type='html'>I spent most of Christmas finishing-off the bulk of the remaining port of Mixtikl to iPhone, with a view to possibly releasing it if we can resolve various issues related to Apple's SDK terms.&lt;br /&gt;&lt;br /&gt;I had planned to work on the Symbian port, but delayed that after reminding myself again of the horrors of porting any code to Symbian. :) That will wait for a few more weeks...!&lt;br /&gt;&lt;br /&gt;Anyways, it is interesting to reflect on the iPhone porting process.&lt;br /&gt;&lt;br /&gt;All in all, I reckon it took me around 3 to 4 weeks to port Mixtikl; which was mainly about creating an iPhone abstraction layer, with Cocoa variants for some of the code.&lt;br /&gt;&lt;br /&gt;Not too hard, but there is some crazy stuff out there:&lt;br /&gt;- you have to abandon all use of fopen() etc., and use Cocoa NSFileManager instead. If you try fopen() in the emulator, it'll try to open files in the host Mac's file system; which isn't what you want. :) opendir() etc. all have to be replaced, too.&lt;br /&gt;- Mixtikl is highly threaded. I simply couldn't get the NSTimer class working properly in such a threaded system, and resorted to using Thread-based timers instead (that wasted a few days, drove me potty!).&lt;br /&gt;- despite what Objective-C/Cocoa heads tell you, I found autorelease pools difficult to get my head round, easy to leak by mistake, and inefficient on occasion. IMO, if you have to learn magic rules for when you can and should release objects returned to you within the system, then the system ain't as smart as it should be. No such problems in Java. No such problems in C++! You need to remember that not all of us spend all of our time writing Objective-C, and it isn't easy to dip-into without making mistakes in this area.&lt;br /&gt;If you call [object release] when you shouldn't, the system fails at some unrelated time in the future; if you fail to call [object release] when you should, the system will leak and it ain't easy to track down! Horrible.&lt;br /&gt;- On a related note, avoid using NSData to hold file read/write data; use the file descriptor and low-level file-descriptor function such as read()/write() instead. Why? Well, if you're reading loads of file data, the NSData objects (which are purged by an auto-release pool) aren't actually purged until some arbitrary point later over which you have no control. This can lead to your system running out of memory as lots of auto-release objects are accumulated but not yet purged (!); leading to memory allocations failing bizarrely even when you're convinced your software should still have access to lots of memory (the memory clearly isn't available until the system purges the autorelease pool.... at some point when it feels like it!). You can avoid this simply by using file descriptors instead (from [myfile fileDescriptor]). Oh, and another reason is that file descriptor based access is a whole lot faster, as there is no unnecessary buffer allocation/releasing going on.&lt;br /&gt;- you'll be amazed at how horrible image drawing is, if you're using Core Graphics like we are. Having to use transformation matrices to account for the inverted Y coordinate was not fun at all, to say the least! :(&lt;br /&gt;&lt;br /&gt;On a separate note, the state of play wrt demo code for Apple/iPhone/Microsoft etc. remains pretty poor. When I worked at Tao Group, I put lots of effort into creating many clear, fully-working and complete demo programs that illustrated many different specific specific uses of our Audio APIs, along the lines of "what code do I need to achieve this specific effect", including playing files, playing streams, adding effects plug-ins etc. I can but presume that the reason that most companies don't do this, is that those responsible for writing the APIs aren't actually genuinely passionate about helping the people who want to use their APIs. This always leads to me wasting lots of time fiddling with poorly written demos, trying to figure-out how to actually use the various APIs...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-3420516692253202520?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/3420516692253202520/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=3420516692253202520' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/3420516692253202520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/3420516692253202520'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2009/01/porting-mixtikl-to-iphone.html' title='Porting Mixtikl to iPhone'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-6211404812310881696</id><published>2008-12-23T09:51:00.000Z</published><updated>2009-03-04T08:46:53.000Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mixtikl'/><title type='text'>Mixtikl now released!</title><content type='html'>&lt;a href='http://www.intermorphic.com'&gt;&lt;br /&gt;&lt;img src="http://www.intermorphic.com/images/logos/Intermorphic_Mixtikl_mobile_music_mixer_software_logo_x100.gif" alt="Mixtikl Logo" border="0"/&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Wow - at long last! Mixtikl is finally out of the door. And before Christmas, too!&lt;br /&gt;&lt;br /&gt;With the software finally released, it was a real treat to sit-back and relax by simply playing with Mixtikl for a while, mixing-up the paks and generative music elements. Frankly, it sounds amazing and is a blast to use.&lt;br /&gt;&lt;br /&gt;Do try out some of the Noatikl generative music items in the Tiklpak Cinematic 120d, which is one of two Tiklpaks that comes embedded with Mixtikl. The generative items show up as red in the content list. They make for amazing backing sounds! :&lt;br /&gt;&lt;br /&gt;So, onwards and upwards from here. We already have lots of things we want to improve, and lots of things we want to add (including many more Tiklpaks!), and we also want to take a look at Noatikl and Liptikl. 2009 should be very busy, but hopefully not as frenetic as 2008!&lt;br /&gt;&lt;br /&gt;Pete&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-6211404812310881696?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/6211404812310881696/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=6211404812310881696' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/6211404812310881696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/6211404812310881696'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2008/12/mixtikl-now-released.html' title='Mixtikl now released!'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-6333571875538084126</id><published>2008-12-09T13:15:00.000Z</published><updated>2009-03-04T08:47:05.138Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mixtikl'/><title type='text'>Mixtikl - launch in a few days</title><content type='html'>Hi Folks,&lt;br /&gt;&lt;br /&gt;We're aiming to launch Mixtikl any day now; we'll do our best to get it out of the door before the weekend starts. :)&lt;br /&gt;&lt;br /&gt;Pete&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-6333571875538084126?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/6333571875538084126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=6333571875538084126' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/6333571875538084126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/6333571875538084126'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2008/12/mixtikl-launch-in-few-days.html' title='Mixtikl - launch in a few days'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-7877348434061835089</id><published>2008-12-04T15:11:00.000Z</published><updated>2009-03-04T08:47:17.862Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mixtikl'/><title type='text'>Mixtikl now in Beta</title><content type='html'>Well, we're almost at the finishing line ... Mixtikl is now in Beta, and we can't be more than a week from the full release. Thank goodness!&lt;br /&gt;&lt;br /&gt;Mixtikl is easily the most complicated piece of software I have ever created! The last time I checked, there was more than half-a-million lines of code in there ... and then there are all Tim's skins and the Tiklpaks and the documentation we've had to create... this has certainly been a labour of love!&lt;br /&gt;&lt;br /&gt;Keep an eye on the Mixtikl site for the draft user guide and lots more information! The user guide is ever expanding, and hopefully makes for an interesting read...&lt;br /&gt;&lt;a href="http://www.intermorphic.com/tools/mixtikl/index.html"&gt;http://www.intermorphic.com/tools/mixtikl/index.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'm looking forward to porting to Symbian Series 60 during my Christmas holidays (yeah, I really know how to enjoy myself!). I've already completed most of the iPhone port, in case we ever decide to release on that platform...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-7877348434061835089?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/7877348434061835089/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=7877348434061835089' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/7877348434061835089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/7877348434061835089'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2008/12/mixtikl-now-in-beta.html' title='Mixtikl now in Beta'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-3384689740441532859</id><published>2008-10-14T12:21:00.000+01:00</published><updated>2008-10-15T09:37:40.723+01:00</updated><title type='text'>Mixtikl Beta (and Alpha!) - and some background</title><content type='html'>It is always something of a relief to hit major project milestones. We have already passed a major one: Mixtikl is midway through its Alpha testing phase and now has people other than Tim and me using it! The Beta release is now only weeks away.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;What is &lt;a href="http://www.intermorphic.com/tools/mixtikl/index.html"&gt;Mixtikl&lt;/a&gt;, and why are we so excited by it?&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.intermorphic.com/tools/mixtikl/index.html"&gt;Mixtikl&lt;/a&gt; is the first mobile music creativity app that does not ignore the importance of the 'full-on' desktop music sequencer. Mixtikl embraces it: with both plug-in and standalone versions. &lt;a href="http://www.intermorphic.com/tools/mixtikl/index.html"&gt;Mixtikl&lt;/a&gt; is for both PC (Windows and Mac) &amp;amp; Mobile!&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.intermorphic.com/tools/mixtikl/index.html"&gt;Mixtikl&lt;/a&gt; is open: Use your own content, or from in add-on Tiklpaks.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Capture / mix / work on content on the move on your mobile.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Finesse your mixes on PC using the Mixtikl plugin.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Move your mixes between mobile and PC and back again.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;'Performer' app - Perform music on your mobile.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;'Remixer' app - Create quick mixes, and mix and match sounds.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;'Partikl' app - Sound and FX design, exporting mix files&lt;/li&gt;&lt;br /&gt;&lt;li&gt;'Player' app - Play lists of Ogg, MIDI and generative music.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Use audio loops, MIDI, generative music &amp;amp; modular synthesis.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Integrated &lt;a href="http://www.intermorphic.com/tools/noatikl/index.html"&gt;Noatikl&lt;/a&gt; &lt;em&gt;generative music&lt;/em&gt; engine for generative music.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Pitch shift your loops and apply realtime FX.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Act as VST or AU plugin in your VST/AU enabled sequencer.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;There is also a whole lot of other stuff in there that we'll let you all know about when we release it!&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;What is &lt;a href="http://www.intermorphic.com/tools/noatikl/index.html"&gt;Noatikl&lt;/a&gt;, and why is it in &lt;a href="http://www.intermorphic.com/tools/mixtikl/index.html"&gt;Mixtikl&lt;/a&gt; ?&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;For those who don't know, &lt;a href="http://www.intermorphic.com/tools/noatikl/index.html"&gt;Noatikl&lt;/a&gt; is a &lt;em&gt;Generative Music&lt;/em&gt; tool. This is an easy-to-use program (with great depth!) which helps you make music; by composing the music for you, in real time, while you give it direction in what to do!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.intermorphic.com/tools/mixtikl/index.html"&gt;Mixtikl&lt;/a&gt; contains a run-time version of &lt;a href="http://www.intermorphic.com/tools/noatikl/index.html"&gt;Noatikl&lt;/a&gt; . That is to say, it &lt;a href="http://www.intermorphic.com/tools/mixtikl/index.html"&gt;Mixtikl&lt;/a&gt; lets you play your &lt;a href="http://www.intermorphic.com/tools/noatikl/index.html"&gt;Noatikl&lt;/a&gt; compositions on whatever device you happen to have &lt;a href="http://www.intermorphic.com/tools/mixtikl/index.html"&gt;Mixtikl&lt;/a&gt; . You can use &lt;a href="http://www.intermorphic.com/tools/mixtikl/index.html"&gt;Mixtikl&lt;/a&gt; 's built-in synth designer (called &lt;em&gt;Partikl&lt;/em&gt;) to attach sounds to your &lt;a href="http://www.intermorphic.com/tools/noatikl/index.html"&gt;Noatikl&lt;/a&gt; compositions, to really bring them to life in a cross-platform way.&lt;br /&gt;&lt;br /&gt;This lets you, for example, create playlists of &lt;a href="http://www.intermorphic.com/tools/noatikl/index.html"&gt;Noatikl&lt;/a&gt; &lt;em&gt;Generative Music&lt;/em&gt; pieces that you or your friends can listen to on the train, where the music changes every time you hear it; as a change from listening to the exact same notes in your MP3 collection time-after-time!&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Releasing software is hard work!&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;It never ceases to amaze me exactly how much work is required to get software out of the door. We've been creating products since the early 1990s, so we've got a feel for how long things will take now and what order things need to be done in.&lt;br /&gt;&lt;br /&gt;Our prediction "way back" when we started creating &lt;a href="http://www.intermorphic.com/tools/mixtikl/index.html"&gt;Mixtikl&lt;/a&gt; out of the ashes of miniMIXA has actually been pretty good; we figured it'd be out sometime this month (October) but it now looks like it'll be November. As always, the delays are due mainly to discovering new things along the way, and adding them in to make the product more interesting! :)&lt;br /&gt;&lt;br /&gt;The software is now pretty much in a Beta state, give or take a few items. We'll let it out of the door when it feels ready!&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Looking back, to look forward&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;It is interesting to reflect that we actually created the first version of miniMIXA back in 2004; and that we won a BAFTA award for miniMIXA back in 2005 - more than three years ago! If our then employers (Tao) had had the vision and resources to back miniMIXA, I wonder where we'd have got the product by now... Still, we're making up for lost time and are having a blast bringing &lt;a href="http://www.intermorphic.com/tools/mixtikl/index.html"&gt;Mixtikl&lt;/a&gt; to life.&lt;br /&gt;&lt;br /&gt;It feels amazing to sit on a train and sculpt music in real-time on my mobile. And, when I want, just kick-back and listen to a generative music playlist courtesy of the built-in &lt;a href="http://www.intermorphic.com/tools/noatikl/index.html"&gt;Noatikl&lt;/a&gt; &lt;em&gt;Generative Music&lt;/em&gt; engine. And I still can't quite believe it when I use the exact same software as an Audio Unit under Logic, a VSTi under Kore 2 or Sonar ... or even standalone on my Mac/Desktop.&lt;br /&gt;&lt;br /&gt;This is been such a long road; we started writing the code that is within the Intermorphic Sound System, which underpins &lt;a href="http://www.intermorphic.com/tools/mixtikl/index.html"&gt;Mixtikl&lt;/a&gt; , more than 6 years ago. We started writing the 2d engine that the Mixtikl UI sits on, well over a year ago. minMIXA itself took around 3 years to write, including three major releases. The port from miniMIXA to &lt;a href="http://www.intermorphic.com/tools/mixtikl/index.html"&gt;Mixtikl&lt;/a&gt; has been a long, hard slog through 2008, but it is great to be so close now to releasing the product that reaches our vision from nearly a decade ago!&lt;br /&gt;&lt;br /&gt;And that product is an extendable, trans-platform music/media mixer and "box of tricks". And it includes a runtime of the &lt;a href="http://www.intermorphic.com/tools/noatikl/index.html"&gt;Noatikl&lt;/a&gt; Generative Music engine. The first Mixtikl versions are for Windows (Standalone, VSTi), Mac (Standalone, Audio Unit, VSTi), Windows Mobile Pocket PC/Smartphone (Standalone). Once those are finally released, Symbian Series 60 looks to be our next target. And hopefully iPhone after that, if Apple ever solve the problems with their SDK.&lt;br /&gt;&lt;br /&gt;We have lots and lots of ideas of ways to extend &lt;a href="http://www.intermorphic.com/tools/mixtikl/index.html"&gt;Mixtikl&lt;/a&gt; - and the prices are going to be amazing. I can't wait for the first full release ... not long now!&lt;br /&gt;&lt;br /&gt;Pete&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-3384689740441532859?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/3384689740441532859/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=3384689740441532859' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/3384689740441532859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/3384689740441532859'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2008/10/mixtikl-beta-getting-close.html' title='Mixtikl Beta (and Alpha!) - and some background'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-7304308100908542866</id><published>2008-09-26T07:49:00.000+01:00</published><updated>2008-10-15T09:38:51.814+01:00</updated><title type='text'>Mixtikl now in Alpha</title><content type='html'>Phew!&lt;br /&gt;&lt;br /&gt;It is always something of a relief to hit major project milestones. And we have just passed a major one: Mixtikl has entered its Alpha testing phase and now has people other than Tim and me using it!&lt;br /&gt;&lt;br /&gt;Pete&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-7304308100908542866?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/7304308100908542866/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=7304308100908542866' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/7304308100908542866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/7304308100908542866'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2008/09/mixtikl-now-in-alpha.html' title='Mixtikl now in Alpha'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-958675077774975435</id><published>2008-07-27T15:33:00.002+01:00</published><updated>2009-06-18T09:58:46.711+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='windows mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='Mixtikl'/><category scheme='http://www.blogger.com/atom/ns#' term='Antix'/><category scheme='http://www.blogger.com/atom/ns#' term='mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='XCode'/><category scheme='http://www.blogger.com/atom/ns#' term='Symbian'/><category scheme='http://www.blogger.com/atom/ns#' term='Antix Game Player'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Porting Mixtikl to Mobile - Windows Mobile, Symbian, iPhone, Antix Game Player</title><content type='html'>While evolving miniMIXA into &lt;a href="http://www.intermorphic.com/tools/mixtikl/index.html"&gt;Mixtikl&lt;/a&gt; at my company &lt;a href="http://www.intermorphic.com/"&gt;Intermorphic&lt;/a&gt;, I've encountered  quite a few issues porting Mixtikl to the various mobile platforms, and I thought it'd be useful to be able to share some of this with those of you interested in writing trans-platform applications. I hope you find this of use! If you have any comments, please let me know!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A bit of background&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Before I start, the first thing to note is that for implementing any trans-platform application of this complexity (750K++ lines of code!), you'll need to start with a common UTF8 library. I wrote that when I first started Liptikl, so didn't have to worry about that this time round!&lt;br /&gt;&lt;br /&gt;I started by implementing Mixtikl to sit on top of the trans-platform graphics layer that I'd already written. The first implementations of this layer were for Juce, Direct X, Windows Mobile GDI, and SDL. Symbian will come soon; iPhone is ongoing, and hopefully Android at some point. The Juce version of the graphics layer for Mixtikl were really easy - Juce is a really great platform for desktop apps. Hence, Mixtikl for Windows and Mac desktops were relatively straight-forward (considering the complexity of Mixtikl!) And, of course, it made the plug-in variants of Mixtikl relatively easy to sort-out.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;What do I like about writing for Windows Mobile?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;- Great tools: Visual Studio is simply superb.&lt;br /&gt;- Fabulous documentation - mostly. I love MSDN, but the API documentation is light on in-situ example code, and I have had to spend a lot of time surfing for solutions to problems. I still rely on my old Windows API Bible (by Jamle L Conger) - certainly the best API guide I have ever seen, packed with examples of every API call; no longer in print, but amazingly still relevant to graphics coding for Windows Mobile!&lt;br /&gt;- Windows Mobile supports full-duplex audio, which is more than can be said for Symbian...!&lt;br /&gt;- Windows Mobile devices are very consistent&lt;br /&gt;- Windows Mobile devices have good user input: joy pads for control, and keypad/touchable screens where appropriate.&lt;br /&gt;- Windows Mobile allows users to copy data freely to-and-from their desktop computer (via Internet Explorer), which is more than can be said for iPhone...!&lt;br /&gt;- End-of line Windows Mobile 2005 devices are really, really good value.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;What don't I like about writing for Windows Mobile?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;- Graphics APIs: it took a while to get our Windows Mobile graphics layer sorted-out.&lt;br /&gt;&lt;br /&gt;I wasn't able to use Direct X out-of-hand for a couple of reasons. The biggest consideration is that we think that it is useful from a usability perspective for an application like Mixtikl to be able to use the mobile device's soft menus, and to display the status bar. However, Direct X apps on Windows Mobile only run full screen, which made it a non-starter. On another point, there is no PNG import support, the blit routines are not flexible, and I'd have had to do a lot of blitting through my own generic blit functions anyways.&lt;br /&gt;&lt;br /&gt;So, we used the standard win32 GDI API for Windows Mobile. The biggest problems I faced here were twofold: I had to implement my own png importer (it is a huge oversight for this not to be built-in to Windows Mobile 2005!), and I didn't realise that when constructing an in-memory bitmap on Windows, I had to WORD-align all lines in the bitmap. That latter problem actually had me stumped for a few days! Also, you need to know to create your bitmaps where possible as 565 BGR bitmaps, as this is the most memory format for Windows Mobile; transparent bitmaps must be stored as 32-bit ABGR bitmaps.&lt;br /&gt;&lt;br /&gt;- Problems with the Visual Studio 2005 C++ compiler&lt;br /&gt;&lt;br /&gt;Even though the port to Windows Mobile wasn't so hard, I faced some serious problems with Visual Studio 2005. The first problem is that the emulator is so *slow*; I ended-up having to get a top-of-the range Mac Book Pro to get the emulator running fast enough for real-time debugging of my audio engine under the emulator. And far more seriously, there is at least one horrible bug in the compiler ... you can read more about the bug here:&lt;br /&gt;&lt;a href="http://vividos.wordpress.com/2007/12/06/the-infamous-arm-by-value-compiler-bug/"&gt;http://vividos.wordpress.com/2007/12/06/the-infamous-arm-by-value-compiler-bug/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://vividos.wordpress.com/2007/12/09/in-depth-analysis-of-the-arm-by-value-compiler-bug/"&gt;http://vividos.wordpress.com/2007/12/09/in-depth-analysis-of-the-arm-by-value-compiler-bug/&lt;/a&gt;&lt;br /&gt;The bug is fixed in Visual Studio 2008...&lt;br /&gt;&lt;br /&gt;- Visual Studio 2008 Pro is required for Windows Mobile 6 development&lt;br /&gt;&lt;br /&gt;Due to the compiler problem in Visual Studio 2005, we upgraded to Visual Studio 2008 Pro; it fixed our compiler problems, and you need at least the Pro version of Visual Studio 2008 to develop for Windows Mobile 6. It is a shame that Microsoft didn't include the Windows Mobile support in the Standard Edition; only the Pro edition (or even more expensive versions) contain Windows Mobile support; I'm sure this puts-off a great number of hobby developers from developing for the platform.&lt;br /&gt;&lt;br /&gt;I've taken a close look some of the ARM code generated by the Visual C++ 9 compiler, and it looks really good; the code it makes for maths routines is as good as (or better!) than I can write by hand, so I'm happy to say that I'm keeping clear of assembler on this platform!&lt;br /&gt;&lt;br /&gt;- The lack of build-in profiler; you don't get a profiler without paying for an even more expensive version of Visual Studio. This seems a shame for hobby developers.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;What do I like about writing for Symbian?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;- Symbian allows users to copy data to-and-from their desktop computer (via Internet Explorer), which is more than can be said for iPhone...!&lt;br /&gt;- Symbian devices have good user input: joy pads for control, and keypad/touchable screens where appropriate.&lt;br /&gt;- Based on the Gnu tool chain, so the compiler is good!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;What don't I like about writing for Symbian?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;- the lack of full-duplex audio support. This is a crazy omission in the Symbian APIs. If anybody out there is listening, you should commission Intermorphic to provide you with a decent audio library. :)&lt;br /&gt;- the need for multiple SDKs. Series 60, UIQ, and variant sub-variants of each... that is a lot of stuff to keep track of.&lt;br /&gt;- if you put your software code a little too deep in your file/folder structure, the Symbian build system falls over!&lt;br /&gt;- documentation nowhere near as good as what is available on MSDN or Apple's site.&lt;br /&gt;- the user interfaces. Why is so much screen real-estate wasted on the title-bar and soft menus, for example?&lt;br /&gt;- the really weird idiosyncracies in their use of C++...&lt;br /&gt;- Symbian doesn't allow full browsing of the local file system from the device; if you want to see what is on a storage card, you have to pop-out the card and look at it with Windows Explorer using a card-reader!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;What do I like about writing for iPhone?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;- XCode is free for all Mac users!&lt;br /&gt;- It uses a good development environment. XCode is quite nice, though the debugger drives me potty compared to Visual Studio when browsing variables in the application code.&lt;br /&gt;- XCode has a really, really good build-in code profiler. Well done Apple!&lt;br /&gt;- No need to write graphics importers; image loading is pretty easy.&lt;br /&gt;- Based on the Gnu tool chain, so the compiler is good!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;What don't I like about writing for iPhone?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;- The real killer, show-stopper, "I don't believe it" problem is that the user can't copy data to-and-from the desktop and any data area that can be seen by an iPhone application. This is a *massive* problem with writing software for iPhone. Why even bother attempting to write creativity software for iPhone, if you can't transfer data between your desktop computer and your mobile? Why didn't Apple provide for a common area to which all apps can read/write, and where Windows Explorer and Finder can also read/write. That seems a complete no-brainer to me.&lt;br /&gt;- You're not allowed to use interpreted languages or scripting engines in your applications (other than those in Apple's own APIs - which aren't adequate). Which is not good news for games that rely on scripting engines to get their behaviours, or the user Lua scripts in Noatikl pieces, to give just two simple examples! I am really puzzled by why there would be such a restriction...&lt;br /&gt;- No support for storage cards. No doubt to force all content to come via the Apple Store...&lt;br /&gt;- No clipboard support. Presumably this is part of a cunning plan by Apple to prevent applications sharing data with each other. :-)&lt;br /&gt;- Objective C. It is a great language that seems very well suited to development in a wide range of contexts. It is a whole lot cleaner than C++ (IMO!). It is great that you can mix objective C and C++ in your code (if you first remember to rename your files to have .mm extensions, rather than the default of .m!). However, it just wouldn't be cost-effective to write a new application purely in Objective C; so you have to write most of your code in C++, and implement a very thin adaptor code layer to the iPhone APIs. Fair enough!&lt;br /&gt;- the touchable user interface can't be operated with a pointer stick; that makes high-precision user interfaces a no-no&lt;br /&gt;&lt;br /&gt;And to close with a slightly off-target point: why doesn't my Mac Book Pro have a built-in 2-button mouse? Drives me potty.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;What next?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.antixlabs.com/"&gt;Antix Game Player&lt;/a&gt; looks interesting! &lt;a href="http://code.google.com/android/"&gt;Android&lt;/a&gt; is also on the near horizon; but, and here is a show-stopper:  it looks like it only allows apps for it to be written in Java ... which seems crazy!&lt;br /&gt;&lt;br /&gt;Hoping this is of interest!&lt;br /&gt;&lt;br /&gt;Pete&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-958675077774975435?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/958675077774975435/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=958675077774975435' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/958675077774975435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/958675077774975435'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2008/07/porting-mixtikl-to-mobile-windows.html' title='Porting Mixtikl to Mobile - Windows Mobile, Symbian, iPhone, Antix Game Player'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-7618981601831047169</id><published>2008-07-11T07:43:00.000+01:00</published><updated>2008-07-11T07:53:20.692+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mixtikl miniMIXA'/><title type='text'>Mixtikl - coming soon!</title><content type='html'>Mixtikl - what a huge challenge. Taking miniMIXA into the real world! What you'll see and hear will just be the tip of an iceberg of multimedia code, enabling what we think will be the first truly trans-platform multi-media creativity tool.&lt;br /&gt;&lt;br /&gt;We've been working towards this for some time now, and it is really quite amazing to physically see/hear Mixtikl working as a native app for Windows and Mac, as an Audio Unit for Mac, and as a VSTi for Windows/Mac, and also on Windows Mobile! With interchangable files that work on all supported platforms! Oh, and an embedded Noatikl generative music engine. :)&lt;br /&gt;&lt;br /&gt;We're currently very busy working on polishing-off the work we've done so far, and will then be looking to port to iPhone - where I hope there won't be too many issues with sand-boxing or integration with Objective C...&lt;br /&gt;&lt;br /&gt;October 2008 release? Well, that's what we're aiming for. Wish us luck!&lt;br /&gt;&lt;br /&gt;Pete&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-7618981601831047169?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/7618981601831047169/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=7618981601831047169' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/7618981601831047169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/7618981601831047169'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2008/07/mixtikl-coming-soon.html' title='Mixtikl - coming soon!'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-886065259972467063</id><published>2008-02-05T20:50:00.000Z</published><updated>2008-10-15T08:59:34.741+01:00</updated><title type='text'>noatikl 1.5</title><content type='html'>Well, that was hard work, but we've now got noatikl 1.5 out of the door.&lt;br /&gt;&lt;br /&gt;For those who don't know, Noatikl is a &lt;span style="font-style: italic;"&gt;Generative Music&lt;/span&gt; tool. This is an easy-to-use program (with great depth!) which helps you make music; by composing the music for you, in real time, while you give it direction in what to do!&lt;br /&gt;&lt;br /&gt;This is a major new development for us, as it completes an arc of development that has been going on for many months now, and has increased the power of noaitkl greatly. The plan was threefold:&lt;br /&gt;- give noatikl pieces the ability to incorporate internally generated structure&lt;br /&gt;- give noatikl the ability to respond to MIDI input events&lt;br /&gt;- introduce a fast, flexible, easy-to-use scripting system to bind it all together!&lt;br /&gt;&lt;br /&gt;So: on one hand, we've added the ability to control noatikl from within, with (optional!) Lua trigger scripts that fire while the piece is playing. The effect on noatikl is quite incredible. It is especially gratifying to see users who are self-confessed 'scriptaholics' test-driving the new features, and finding that it totally transforms their ability to control noatikl in the way they want.&lt;br /&gt;&lt;br /&gt;On the other hand, noatikl can now be controlled in real-time in response to incoming MIDI controller events. Not only that, but noatikl automatically harmonises with incoming MIDI note events; and those note events can be used to trigger various responses within noatikl using the scripting engine. noatikl can now fairly be described as a hyperinstrument!&lt;br /&gt;&lt;br /&gt;What next? Well, for starters we have plans to greatly improve the pattern handling within noatikl. That should keep us busy. :)&lt;br /&gt;&lt;br /&gt;Pete&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-886065259972467063?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/886065259972467063/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=886065259972467063' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/886065259972467063'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/886065259972467063'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2008/02/noatikl-15.html' title='noatikl 1.5'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-5968675056448001842</id><published>2008-01-25T10:19:00.001Z</published><updated>2008-01-25T11:08:41.023Z</updated><title type='text'>Graphics libraries and scripting</title><content type='html'>In case you're interested, in addition to adding Lua-based scripting to &lt;a href="http://www.intermorphic.com/tools/noatikl/index.html"&gt;noatikl&lt;/a&gt;, I've been using the same scripting engine in prototyping optikl, the generative visual art program we hope to release some time.&lt;br /&gt;&lt;br /&gt;To help optikl and our other products go wherever we want, including maybe to mobile, I've written a common graphics library adaptor layer that sits on top of SDL, Juce and what have you. So this will let us, in future, write our apps once and simply recompiling them for whatever the target platform might be, without the need for any major rewrites. :)&lt;br /&gt;&lt;br /&gt;Pete&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-5968675056448001842?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/5968675056448001842/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=5968675056448001842' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/5968675056448001842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/5968675056448001842'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2008/01/graphics-libraries-and-scripting.html' title='Graphics libraries and scripting'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7435258304396242206.post-3608796438974783568</id><published>2008-01-25T10:14:00.000Z</published><updated>2008-01-25T10:17:13.477Z</updated><title type='text'>Low-latency audio IO on a MacBook!</title><content type='html'>My brother (&lt;a href="http://www.colartz.com"&gt;Tim Cole&lt;/a&gt;) has tried using Asio4All to get low-latency audio on his Mac Book, but ended-up having various problems with it.&lt;br /&gt;&lt;br /&gt;Well, I’ve found the easiest solution on my MacBook and Mac Mini was to get a really cheap Firewire low-latency audio box, that works with both Windows XP and Mac OS X. This was the Behringer FCA202. There are lots of really cheap offers for this in the webstores right now, and it is a tremendous piece of kit!&lt;br /&gt;&lt;br /&gt;I’ve been using this to work on ideas for the &lt;a href="http://www.intermorphic.com/tools/noatikl/index.html"&gt;noatikl&lt;/a&gt; hyperinstrument and MIDI-control features.&lt;br /&gt;&lt;br /&gt;For that matter, I wonder if we should use the term “hyperinstrument” or “hyper instrument”. I’ll stick with the first spelling, unless anybody can tell me otherwise! :)&lt;br /&gt;&lt;br /&gt;Pete&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7435258304396242206-3608796438974783568?l=sseyod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sseyod.blogspot.com/feeds/3608796438974783568/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7435258304396242206&amp;postID=3608796438974783568' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/3608796438974783568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7435258304396242206/posts/default/3608796438974783568'/><link rel='alternate' type='text/html' href='http://sseyod.blogspot.com/2008/01/low-latency-audio-io-on-macbook.html' title='Low-latency audio IO on a MacBook!'/><author><name>Pete Cole</name><uri>http://www.blogger.com/profile/04463588527112443658</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
