2011年4月21日木曜日

OpenWnnのビルド

ネットワークのないところでもかな漢字変換が使えるようにするためOpenWnnの移植を考えてます。まずはソースをダウンロードしてOpenWnnをmakeして端末にインストールするまでをやったので、その作業メモです。

本当はAndroidの全ビルドをやりたかったのですが、"Could not load 'clearsilver-jni'"  というエラーがどうしても解消できなかったので断念。やり方知ってる人は教えてください。

【必要マシン環境】
froyo以降では64bit Linux環境が必要なようです。32bit環境でやると "Only 64-bit build environments are supported beyond froyo/2.2." というエラーが出て止まります。

Java はSun (今はOracleですが) のサイトからダウンロードした 1.6 が必要です。Ubuntuのapt-getでインストールされるOpenJDKを使うと、sunからダウンロードしたjavaを使ってくれというエラーメッセージが出力されました。


Androidソースのビルドに必要なライブラリ】
これも"Android ソース"のビルド方法のサイトにいろいろ載っていますが、 だいたい次のようなものが必要です。

git-core gnupg flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential
zip curl libncurses5-dev zlib1g-dev lib32readline5-dev g++-multilib

apt-getコマンドなどでインストールしておきます。

【Androidソースのダウンロード】
OpenWnnの部分だけあればいいのではなく、ライブラリとかmake環境の作成とかに必要なので全ソースを落とさなければなりません。まあOpenWnnだけ落とす方法は知らないのですが。

git-core をインストールし、repoをインストールして、repo syncでダウンロードします。このへんは "Android ソース" などで検索するとやり方を紹介したサイトがいろいろでてきます。

このへんを参考にしました。
Androidソースコードをダウンロード・ビルドするには - 逆引きAndroid入門



うちのネットワーク環境がおかしいのかもしれませんが、Androidソースのダウンロード中で止まってしまうことがよくありました。放っておくと一晩たってもそのままなので、ダウンロードが凍りつく度にコントロールCで中断して、repo syncと打ちこんで再開し、と長い時間かかって落としました。


【Androidのビルドエラー】
なんとか全ソースを落としたらビルドです。ここではソースを落としたディレクトリを'android'ディレクトリとします。android/build/envsetup.shで環境をセットアップしてから'm'コマンドでビルドしてみます。
[android]$ source build/envsetup.sh
including device/htc/passion/vendorsetup.sh
including device/samsung/crespo/vendorsetup.sh
[android]$ m
============================================
PLATFORM_VERSION_CODENAME=AOSP
PLATFORM_VERSION=AOSP
TARGET_PRODUCT=full
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv5te
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=OPENMASTER
============================================
....(略)
Docs droiddoc: out/target/common/docs/doc-comment-check
Could not load 'clearsilver-jni'
java.library.path = out/host/linux-x86/lib
make: *** [out/target/common/docs/doc-comment-check-timestamp] エラー 45
上のように "Could not load 'clearsilver-jni'" と表示されてうまくいきません。ググるとJava1.5を使うといいみたいですが、最新のソースではJava1.6を使わないと警告がでるようです。いろいろ調べてみましたが、どうもよく分かりません。うむむ。



【OpenWnnのJNIライブラリのビルド】
気をとりなおして、OpenWnnのビルドだけを行うことにします。

OpenWnnは JNIで作られたライブラリとJavaのソースから構成されています。JNIのライブラリはクロスコンパイラのあるLinux環境で作成し、残りのJavaソースはEclipse環境に移してビルドすることにします。
 
まずLinuxで 'android/packages/inputmethods/OpenWnn' に移動します。ここがOpenWnnのソースディレクトリです。'mm' コマンドでこのディレクトリ以下をmakeすると次のエラーメッセージが表示されます。
[OpenWnn]$ mm
...(略)
make: *** `out/target/product/generic/obj/SHARED_LIBRARIES/libWnnEngDic_intermediates/LINKED/libWnnEngDic.so'に必要なターゲット `out/target/product/generic/obj/lib/libc.so' を make するルールがありません. 中止.
'libc.so'が必要なので、これをビルドするソースを探します。これは 'android/bionic/libc' にあります。そこに移って再び 'mm' でビルドします。
 すると今度は 'out/target/product/generic/obj/lib/libdl.so' がないと言ってくるので、'android/bionic/libdl' に移ってビルドします。JNIライブラリが作成されるまで、このように人間makeをやり続けます。

JNIライブラリで必要なのは 'android/out/target/product/generic/obj/lib' にある libwnndict.so libWnnJpnDic.so libWnnEngDic.so の3つのファイルです。

人間makeを続けていくと、そのうち package.apk を作成するのに必要なファイルがないと言ってきますが、この時点で libwnndict.so libWnnJpnDic.so libWnnEngDic.soの3つが作成済となっています。あとはEclipse環境でやります。

依存関係をまとめると次のようになります。表の下から順にビルドするといいでしょう。

作成ファイル作成ディレクトリ依存ファイル
libwnndict.so libWnnJpnDic.so libWnnEngDic.so android/packages/inputmethods/OpenWnn libc.so
libc.so android/bionic/libc libdl.so
libdl.so android/bionic/libdl apriori soslim
apriori android/build/tools/apriori libelfcopy.a libelf.a
libelfcopy.a android/external/elfcopy -
libelf.a android/external/elfutils -
soslim android/build/tools/soslim -


※実は android ディレクトリで、'make OpenWnn' というコマンドを打てば、最後まで作成できるということを後から知りました。ただし、この方法でできた OpenWnn.apk は必要なライブラリがリンクされていないのでサイズが半分くらいしかなく、実機に持っていっても実行できません。ここでできたJNIライブラリだけを使って以下の作業を行う必要があります。


【OpenWnn.apkのビルド】
 ここから先は「Android Hacks――プロが教えるテクニック & ツール」という本のadamrockerさんの記事が参考になりました。

 OpenWnn のソースをEclipse環境に移します。Windowsなどでも大丈夫です。必要なものは 'android/packages/inputmethods/OpenWnn'以下にある src/ res/ ディレクトリと、AndroidManifest.xml ファイルと、'android/out/target/product/generic/obj/lib' にあるJNIライブラリ libwnndict.so libWnnJpnDic.so libWnnEngDic.soです。JNIライブラリは移動先に libs/ ディレクトリを、その下に armeabi/ ディレクトリを作成し、その下にコピーします。

移動先を OpenWnnTestとすると以下のようになります。
OpenWnnTest/
┝ AndroidManifest.xml
┝ src/
┝ rec/
└ libs/
   └ armeabi/
     ┝ libwnndict.so
     ┝ libWnnJpnDic.so
     └ libWnnEngDic.so
移動先ができたらEclipseを起動し、新規プロジェクトを作成します。Androidプロジェクトを選択し、詳細設定で既存ソースを元に作成するようにし、今作ったOpenWnnTestを指定すればOKです。

あとは通常にビルドすればいいのですが、リソースファイルがgen/の下にできないときは、プロジェクトのプロパティからJava Build Pathを選択し、Order and Exportでクラスの作成順序をチェックします。

0 件のコメント:

コメントを投稿