ClojureでAndroidアプリ

ClojureJVM上で動くのだからもしかしたらAndroidアプリも作れるのではないだろうかと思い、いろいろ調べてみた結果とりあえず入り口には到達できたので備忘をかねて公開。
今回は基本的にeclipseとかandroid-modeは使わずにコマンドラインでいくことにした。(というかandroid-mode動かなかった…orz)


以下androidSDKとClojureはインストール済みであることを前提とします。

参考にしたサイトとか書籍

あらかじめこのサイトを参考にしてAndroid用のclojure.jarを作成しておく。

プロジェクト作成

まずは使用できるターゲットの確認。

$ android

android SDK and AVD Manager」が起動するので、Installed Packagesで目的のターゲットがあるか確認する。なければAvailable Packagesからインストール。
今回は現在(2010-2-20)最新のver2.1を使うことにする。

プロジェクト作成に必要なターゲットidを確認する。

$ android list target
(中略)
id: 11 or "Google Inc.:Google APIs:7"
     Name: Google APIs
     Type: Add-On
     Vendor: Google Inc.
     Revision: 1
     Description: Android + Google APIs
     Based on Android 2.1 (API level 7)
     Libraries:
      * com.google.android.maps (maps.jar)
          API for Google Maps
     Skins: WQVGA400, WVGA854, HVGA (default), WQVGA432, WVGA800, QVGA

ver2.1はid 11であることを確認。

プロジェクトを作成。今回は『初めてのAndroid』に載っているSudokuのプロジェクトを作る。

$ android create project --target 11 --path ./Sudoku --activity Sudoku --package org.example.Sudoku

プロジェクトをClojure用にカスタマイズ

dalvikVM用clojure.jarをコピー。

$ cd Sudoku
$ cp ~/opt/clojure-android/clojure.jar ./libs/

Clojurebuild.xmlをダウンロード。build.xmlから呼ばれるcompile.cljもダウンロード。

$ mv build.xml build.xml.org
$ wget http://github.com/remvee/clojurehelloandroid/raw/master/build.xml
$ wget http://github.com/remvee/clojurehelloandroid/raw/master/compile.clj

build.xmlの2行目にあるプロジェクト名をSudokuにしておく。

<project name="Sudoku" default="debug">

同じく18行目のパッケージ名をorg.example.Sudokuにしておく。

    <property name="application-package" value="org.example.Sudoku" />

Sudoku.javaを消して代わりにSudoku.cljを作成。

$ rm src/org/example/Sudoku/Sudoku.java
; Sudoku.clj
(ns org.example.Sudoku.Sudoku
  (:gen-class
   :extends android.app.Activity
   :exposes-methods {onCreate superOnCreate}))

(defn -onCreate [this #^android.os.Bundle bundle]
  (.superOnCreate this bundle)
  (.setContentView this org.example.Sudoku.R$layout/main)
  (let [tv (new android.widget.TextView this)]
    (.setText tv "Hello Android from Clojure!")
    (.setContentView this tv)))

ビルドとインストール

自分の環境だとbuild.propertiesに以下を追加してやらないといけなかった。

sdk-folder=/home/hoge/opt/android/platforms/android-2.1
android-tools=/home/hoge/opt/android/platforms/android-2.1/tools
apk-builder=/home/hoge/opt/android/tools/apkbuilder
adb=/home/hoge/opt/android/tools/adb

エミュレータが立ち上がっている状態で、

$ ant install

としてやればコンパイルしてインストールまでやってくれる。
以下エミュレータスクリーンショット。右上にSudokuが追加されている。

上書きインストールはant reinstall、削除はant uninstallでできる。