Hello world in Scheme for Android
(This has been updated here.)
Google's phone operating system "Android" is based on a custom Java virtual machine on top of GNU/Linux. So it occurred to me: How difficult would it be to get a Kawa application running on Android? Not that difficult, it turns out.
Here is "Hello world" written in Kawa Scheme:
(module-extends android.app.Activity) (module-name kawa.android.hello) (define (onCreate (savedInstanceState :: android.os.Bundle)) :: void (invoke-special android.app.Activity (this) 'onCreate savedInstanceState) (let ((tv :: android.widget.TextView (make android.widget.TextView (this)))) (tv:setText "Hello, Android from Kawa Scheme!") ((this):setContentView tv)))
It's got some annoying boiler-plate, though it's similar to the Java version; hopefully we can simplify later.
Here is how to get this program running on the Android emulator on GNU/Linux. (I haven't yet figured out how to get it working on the actual phone.) This article Android Phone development from the Linux command-line was helpful in figuring out what to do.
First you need to download the Android SDK. Unzip, in a suitable location,
which we'll refer to as ANDROID_HOME
:
ANDROID_HOME=/path/to/android-sdk-linux_x86-1.0_r2 PATH=$ANDROID_HOME/tools:$PATH
To get this to work I had to make some modest changes to Kawa, so you will need to get the Kawa developer sources from SVN.
You need to configure
and make
Kawa appropriately:
KAWA_DIR=path_to_Kawa_sources cd $KAWA_DIR ./configure --with-android=$ANDROID_HOME/android.jar make
Next, we need to create a project or activity,
in the target directory KawaHello
,
with the main activity
being a class named hello
in a package kawa.android
:
activitycreator --out KawaHello kawa.android.hello
Replace the skeleton hello.java
by the
Scheme code we started out with:
cd KawaHello HELLO_APP_DIR=`pwd` cd $HELLO_APP_DIR/src/kawa/android/ rm hello.java emacs hello.scm
We need to copy/link the Kawa jar file so the Android SDK can find it:
cd $HELLO_APP_DIR ln -s $KAWA_DIR/kawa-1.9.3.jar libs/kawa.jar
We also need to modify the Ant build.xml
so it knows how to compile Scheme code:
patch < build-xml.patch
Finally, we can compile our application:
ant
Next start up the Android emulator:
emulator&
Wait until Android has finished booting, clisk the menu and home buttons. Click the tab above the menu key to show the installed applications. Now install our new application:
adb install bin/hello-debug.apk
The new hello
application should show up.
Click it, and you should see something like:
Some debugging notes
You will find a copy of the SDK documentation in
$ANDROID_HOME/docs/documentation.html
.
If the emulator complains that your application
has stopped unexpectedly
, start ddms
(Dalvik Debug Monitor Service), click on the kawa.android
line in the top-left sub-window to select it, then from the
Device
menu select Run logcat...
.
This shows log messages, stack traces, output from the Log.i
loggin method, and other useful information.
To uninstall your application, do:
adb uninstall kawa.android