階層 / 関連
Linux(PS2)
このサイトについて
 

JavaVMを使う(Kaffe-1.0.6)

Up↑

 

2004/03/30追記
kaffe-1.0.7に関しては、「Kaffe-1.0.7 を MIPS系 LINUXに移植する」が参考になります。

  1. 概要
  2. 必要なファイルを準備する
  3. libffiのコンパイル&インストール
  4. kaffeのコンパイル&インストール
  5. PATHを通す
  6. javaプログラムを書いてコンパイル&実行!
  7. 2001/07/31追加情報
  8. 2002/06/01初校PDF公開

概要

このページでは、Linux(for PlayStation 2)JavaVM(Kaffe-1.0.6)をインストールし、簡単なJavaサンプルを実行するまでを紹介します。JavaはVM(バーチャルマシン:仮想マシン)と呼ばれる一種のインタープリタ上で動くプラットフォームを選ばないプログラミング言語です。

Linuxのお約束に明るくなかった私には少々ハードルが高く、インストール作業は結構苦労しました。もしかしたら同じように苦労している他のOS系の方がいらっしゃるのではないかと思い(もちろん自分のためにも)ここにインストール記を残しておきます。そういうわけで、かなり冗長な内容になっておりますので、予めご了承下さい。

なお、インストール作業はすべてtelnetを使い、Windows 2000/XP機からリモート操作で行いました。

濃いグレー(ほとんど黒)の部分、

例えばこのような部分

TeraTermによる操作を表しています。文字列をブラウザ画面よりコピーし、TeraTermを使っている場合はAltVで貼り付けられますので作業の省力化に役立つのではないかと思います。

[UP]

必要なファイルを準備する

まずは「libffi-1.20」のソースをダウンロードしました。私の勉強不足で詳しくは分かりませんが、これが無いとコンパイルできないようです。

(ftpサイト)

ftp://sourceware.cygnus.com:/pub/libffi/libffi-1.20.tar.gz

(httpミラーサイト)

http://mirrors.rcn.net/pub/sourceware/libffi/libffi-1.20.tar.gz

次に「kaffe-1.0.6」のソースをダウンロードしました。

(kaffe-1.0.7は、まだインストール確認できておりません)

http://www.kaffe.org/

最後にはーめるん氏のサイトよりパッチをダウンロードします。氏より最新のパッチをお預かりしておりますので、次のリンクよりダウンロードできます。

libffi-1.20.tar.gzに当てるPS2 LinuxKit用パッチ

libffi-1.20-for-ps2linux.patch.gz

kaffe-1.0.6.tar.gzに当てるPS2 LinuxKit用パッチ

kaffe-1.0.6-for-ps2linux.patch01.gz

用意するアーカイブファイルは、以上4つです。

[UP]

libffiのコンパイル&インストール

とりあえず/home/nao_m(自分のユーザー名)に/tmpディレクトリを掘りました。そこにSamba経由でWindows 2000からダウンロードしたファイルをコピーすることにしました。

libffiのソースとパッチをコピーし、libffiを解凍するところ

libffiのソースとパッチのアーカイブは、同じディレクトリに置きます。

$ gtar xvfz libffi-1.20.tar.gz

と打ち込み、libffiを解凍します。

新しくlibffi-1.20ディレクトリができたことを確認。

正しく解凍されると、新しくlibffi-1.20ディレクトリができるので、そこに入ってパッチを当てます。

$ cd libffi-1.20
$ zcat ../libffi-1.20-for-ps2linux.patch.gz | patch -p1

パッチを当てたところ。

無事パッチが当たったら、configureします。これは、mips版ソースをコンパイルできるようにソース配置を変更するものと理解しました。

$ ./configure --host=mips-sgi-irix5.0 --prefix=/usr/local/libffi

これでlibffiをコンパイルする準備が整いました。上で指定したディレクトリにインストールされるハズです。

あとは次のように

$ gmake CC=gcc

と打ち込みコンパイルします。

この例では、コンパイルとインストールを一緒に行っています。

ここでエラーが発生しました。ユーザーnao_mでは/usr/localにディレクトリを作る権限が無いのでした…。失敗失敗。

/usr/localにディレクトリが作れずエラーになったところ。

というわけで、その場でrootになって再コンパイルします。失敗を重ねて覚えて行くのです。

 

今度はO.K.だったようです。次のように打ち込みインストールします。

$ gmake install

Windows 2000側からもファイラーを使って/usr/localを覗いてみました。無事libffiディレクトリが作られたようです。

Windows 2000から/usr/localを覗いたところ。

最後に、出来たばかりの/usr/local/libffi/に入り、

$ cd /usr/local/libffi/

次のように打ち込めば完了です。

$ ln -s /usr/local/libffi/lib/libffi.so.2.1.3 libffi.so

[UP]

kaffeのコンパイル&インストール

お次はJavaVM本体であるkaffe-1.0.6のコンパイルです。libffiの時と同じように、/home/nao_m/tmpディレクトリ(我が家の場合)にKaffe-1.0.6のソースとPS2 LinuxKit用パッチをコピーします。

kaffeのソースとパッチをコピーし、Kaffe-1.0.6を解凍するところ。

libffiのときと同様に、ソースとパッチのアーカイブは同じディレクトリに置きます。

$ gtar xvfz kaffe-1.0.6.tar.gz

と打ち込み、Kaffe-1.0.6を解凍します。

新しくkaffe-1.0.6ディレクトリができた。

正しく解凍されると、新しくkaffe-1.0.6ディレクトリができるので、そこにカレントを移動してパッチを当てます。

$ cd kaffe-1.0.6
$ zcat ../kaffe-1.0.6-for-ps2linux.patch.gz | patch -p1

無事パッチが当たったら、configureします。

パッチを当てたのでconfigureするところ。

何かの呪文のように長いですが、下のように間違えずに打ち込みます。

横に長くなってしまうため、スクロール窓にしました。後半が読めない場合は、次の本文行まで含めてコピーするか、お手数ですがこのHTMLソースを直接参照して下さい。

$ ./configure --with-libffi --prefix=/usr/local/kaffe --with-libraries=/usr/local/libffi/lib --with-includes=/usr/local/libffi/include

これでkaffe-1.0.6をコンパイルする準備が整いました。

$ gmake CC=gcc

と打ち込みコンパイルします。

 

2002/08/21

次のブロックは最新パッチを使った場合には必要ありません。「gmake install」の部分まで読み飛ばして下さい。

またエラー発生。

コンパイルが始まり少し経過した頃、utf8const.cでエラーになりました。たどってみると、「./kaffe-1.0.6/config/mips/linux/md.h」の中でインクルードされているsigcontext.hが無いらしい。で、色々検索してみると、どうもインクルードしなくても問題無いらしい。

そういうわけで…

//#include <sigcontext.h>

コンパイル通りました。

しばらくすると、またエラーが出ました。今度はなんじゃぁ?

またまたエラー発生。

今度は「./kaffe-1.0.6/libraries/clib/native/System.c」の中です。おかしいなぁ。何か手順忘れているのかなぁと思いつつ該当ソースを眺めてみると、タイムゾーンに関る初期化なのかな?

だいぶ強引ですが、この#if definedブロックをまるごとコメントアウトしてしまいました(414〜420行)。412行目にtzoneの初期値が入っているのでとりあえずの動作チェックには支障ありませんが、気持ち悪いので後で調べてみます

2001/07/31追記
7/30時点のパッチだけではコンパイル通らないらしいです。パッチの作者であるはーめるん氏より連絡頂きました。今後の新パッチでは、上記二ヶ所の修正を施さなくてもコンパイル通るようになるそうです。パッチを当ててもコンパイルが通らない場合は、新パッチがアップされるまで待つか、その場しのぎになりますが、このページで紹介している方法を試してみて下さい。他にもjava2のjarファイルに関する情報を頂きました。ありがとうございました。

というわけで、やっとコンパイルできたようです。

 

コンパイルが成功したらインストールします。

$ gmake install

いつものようにWindows 2000側からファイラーを使って/usr/localを覗いてみました。無事kaffeディレクトリが作られたようです。

Windows 2000から/usr/localを覗いたところ。

[UP]

PATHを通す

最後にkaffeをインストールしたディレクトリにpathを通します。

Windowsから始めた方には馴染みが薄いと思いますが、実行ファイルを特定のディレクトリに作成した場合はOSに対して「その場所」を教えてあげないとシェルからコマンドを入力しても動きません。DOSから触っていた方なら「autoexec.bat」に「path=」で追加していたと思います。

Linux(for PlayStation 2)では標準でbash(Bourne Again SHell)というシェルが使えるようになっているようですので、

.bash_profile

というファイルを編集してpathを追加します。このファイルは/homeの各ユーザーディレクトリにあります(見えなければls -aで表示されるハズです)。

エディタで書き換えて保存したら、loginし直しましょう。

# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin:/usr/local/kaffe/bin
BASH_ENV=$HOME/.bashrc
USERNAME=""

export USERNAME BASH_ENV PATH

:/usr/local/kaffe/binをpathに追加したところ。

[UP]

Javaプログラムを書いてコンパイル&実行!

これでやっとLinux(for PlayStation 2)にJavaVMが入りました。早速簡単なjavaソースを書いてコンパイル&実行してみましょう。

いくら簡単な…とはいえ、ちょっと簡単すぎますかね。ソースは使い慣れたWindows版秀丸エディタで書きました。ここではソースファイル名を「test.java」とし、class名も「test」にしました。

PS2側には新しくjavaソース置き場のディレクトリを作り、そこにWindows 2000からファイルコピーしました。

$ javac test.java

これでjavaソースがコンパイルされ、classファイルに変換されます。できたclassファイルを次のようにkaffeに与えると実行されます。

$ kaffe test

または

$ java test

下図は、一連の操作をキャプチャしたものです。

JDKやMicrosoft Visual J++で作ったclassファイルもそのまま動きました。オプションで-jarを付ければ、アーカイブされたjarファイルも動くようです。

このテストプログラムのように日本語を表示する場合には注意が必要です。今回はShift-JISでソースを書き、TeraTermの送受信もShift-JISで行ったために表示できています。実機で見ると文字化けします。

 

【おしらせ】

このページが技術評論社「JAVA PRESS Vol.22」に掲載されました。紹介記事の方は、はーめるん氏のパッチを使っておりませんが、内容はほぼ同等です。

jp22-PS2.pdf:初出:技術評論社刊『JAVA PRESS』Vol.22

※初校のPDFのため、一部発刊されたものと違う部分があります。

 

Up↑

(2001/07/29)

 

[UP]