#ref(x2_3aa5ec1.jpeg); #contents * OCaml トップレベル on Android ソース [#u7698128] http://bitbucket.org/keigoi/ocaml-toplevel-android/ - 下の OCaml on Android が必要 *O'Caml on Android 3.12 版 [#f3412331] - NO WARRANTY - 無保証 ** このビルドでできること [#zd6c4526] - Androidネイティブの実行形式を生成できる -- ただし、Androidアプリ(.apk)からの呼び出しは(rootedでないと)できない -- Androidのターミナル (adb shellやTerminal Emulatorなど) から起動可能 -- たとえば ocamlトップレベルが adb shellから起動できる(後述)。 - .soファイルを生成できる。やり方は普通のOCamlと同じ。 [[C共有ライブラリの作成]] を参照 -- 適切なスタブを用意すれば AndroidアプリからOCamlコードを呼び出せる(はず) ** パッチのダウンロード [#g0fa744d] - OCaml 3.12.0 用パッチ #ref(ocaml-android-3.12.0.diff); ** 準備 [#x444edaa] + [[Android NDK 1.6r4:http://developer.android.com/sdk/ndk/index.html]] をダウンロードしてどこかに展開する. + 展開したNDKからmemory.h を削除する。 + C標準ライブラリのヘッダから memory.h をincludeしている行を削除する。 ** ビルド [#x492e32f] + ocaml-3.12.0をダウンロードし、ホストのocamlrunとocamlyaccをビルド. ''注意:32bit版をビルドすること'' -- 32bit版のビルド方法は http://caml.inria.fr/pub/distrib/ocaml-3.12/notes/INSTALL を参照 tar jxf ocaml-3.12.0.tar.bz2 mv ocaml-3.12.0 ocaml-host cd ocaml-host ./configure -cc "gcc -m32" -as "as -arch i386" -aspp "gcc -m32 -c" # Snow Leopardの場合。 pushd . && cd byterun && make all && cp ocamlrun ../.. && cd ../yacc && make all && cp ocamlyacc ../.. && popd + 別のocaml-3.12.0のツリーを展開し、パッチをあてる tar jxf ocaml-3.12.0.tar.bz2 mv ocaml-3.12.0 ocaml-target cd ocaml-target patch -p1 <../ocaml-android-3.12.0.diff + Makefileを修正する vi config/Makefile + ターゲットのocamlrunとocamlyaccをビルドして、退避させ、ホストのものに置き換える pushd . && cd byterun && make all && mv ocamlrun ocamlrun.target && cd ../yacc && make all && mv ocamlyacc ocamlyacc.target && popd cp ../ocamlrun byterun/ && cp ../ocamlyacc yacc/ + makeする (configure''してはいけない'') make world make opt ** インストール [#f5f0cefd] make install ** テスト [#c4ef61d9] - ここでは /data/local/tmp/ocaml に置いて起動を確認するが、実行可能属性を付加できないファイルシステム (/sdcardなど) では動かない adb shell mkdir /data/local/tmp/ocaml adb push byterun/ocamlrun.target /data/local/tmp/ocaml adb push ocaml /data/local/tmp/ocaml for FILE in stdlib/*.cm[ia]; do adb push $FILE /data/local/tmp/ocaml; done - 実行してみる adb shell cd /data/local/tmp/ocaml ./ocamlrun.target ./ocaml Objective Caml version 3.12.0 # 1. +. 1.;; - : float = 2. # * 履歴 [#secdfdb6] - ocamloptで生成したバイナリが動作しない不具合を修正(MKEXEにリンカオプションが渡されていなかった) (2010/12/7 23:35) - 共有ライブラリが一応ビルドできるようになった (2010/12/8 0:16)