(57)【特許請求の範囲】
【請求項１】
ＯＳ、ＪａｖａＶＭ、テーブル生成プログラム、ＪａｖａＡｒｃｈｉｖｅファイルを搭載するテーブル生成端末と、Ｊａｖａ以外の言語で開発されたアプリケーションを実行する他プログラミング言語実行環境と、キャストプログラム、ＪａｖａＶＭ、ＪａｖａＡｒｃｈｉｖｅファイルを搭載するアプリケーション実行端末から成るライブラリ変換環境におけるライブラリ変換方法であって、
前記テーブル生成プログラムが、前記ＪａｖａＡｒｃｈｉｖｅファイルを解析し、Ｊａｖａクラス名をクラステーブルに格納するステップと、Ｊａｖａメソッド名と引数の型と戻り値の型を格納するメソッドテーブルを生成するステップとを備え、
前記キャストプログラムがクラス登録関数及びメソッド登録関数を備え、前記クラス登録関数が前記クラステーブルからＪａｖａクラス名を抽出し、同名のクラスを前記他プログラミング言語実行環境に定義するステップと、前記メソッド登録関数が前記メソッドテーブルからＪａｖａメソッド名と引数の型と戻り値の型を抽出し、同名のＪａｖａメソッドを呼び出す関数を前記他プログラミング言語実行環境に定義するステップとを備えることを特徴とするプログラミング言語間でのライブラリ変換方法。
【請求項２】
前記テーブル生成プログラムが、前記クラステーブルにＪａｖａスーパークラスを特定する情報を格納するステップをさらに備え、
前記キャストプログラムが、前記クラステーブルからＪａｖａスーパークラスを特定する情報を抽出し、Ｊａｖａのクラス階層を前記他プログラミング言語実行環境上に反映するステップをさらに備えることを特徴とする請求項１に記載のプログラミング言語間でのライブラリ変換方法。
【請求項３】
前記キャストプログラムがキャスト関数を備え、このキャスト関数により前記メソッドテーブルからＪａｖａメソッドの引数と戻り値の型を抽出し、引数と戻り値を、前記他プログラミング言語実行環境上でのデータフォーマットと前記ＪａｖａＶＭ上でのデータフォーマットに相互に変換するステップとをさらに備え、Ｊａｖａメソッドを呼び出す前後に前記キャスト関数を呼び出すステップをさらに備えることを特徴とする請求項２に記載のプログラミング言語間でのライブラリ変換方法。
【請求項４】
ＯＳ、ＪａｖａＶＭ、テーブル生成プログラム、ＪａｖａＡｒｃｈｉｖｅファイルを搭載するテーブル生成端末と、Ｊａｖａ以外の言語で開発されたアプリケーションを実行する他プログラミング言語実行環境と、キャストプログラム、ＪａｖａＶＭ、ＪａｖａＡｒｃｈｉｖｅファイルを搭載するアプリケーション実行端末から成るライブラリ変換環境において実行されるプログラムであって、
前記テーブル生成プログラムが、前記ＪａｖａＡｒｃｈｉｖｅファイルを解析し、Ｊａｖａクラス名をクラステーブルに格納するステップと、Ｊａｖａメソッド名と引数の型と戻り値の型を格納するメソッドテーブルを生成するステップとを備え、
前記キャストプログラムがクラス登録関数及びメソッド登録関数を備え、前記クラス登録関数が前記クラステーブルからＪａｖａクラス名を抽出し、同名のクラスを前記他プログラミング言語実行環境に定義するステップと、前記メソッド登録関数が前記メソッドテーブルからＪａｖａメソッド名と引数の型と戻り値の型を抽出し、同名のＪａｖａメソッドを呼び出す関数を前記他プログラミング言語実行環境に定義するステップとを備えることを特徴とするプログラミング言語間でのライブラリ変換プログラム。
【請求項５】
前記テーブル生成プログラムが、前記クラステーブルにＪａｖａスーパークラスを特定する情報を格納するステップをさらに備え、
前記キャストプログラムが、前記クラステーブルからＪａｖａスーパークラスを特定する情報を抽出し、Ｊａｖａのクラス階層を前記他プログラミング言語実行環境上に反映するステップをさらに備えることを特徴とする請求項４に記載のプログラミング言語間でのライブラリ変換プログラム。
【請求項６】
前記キャストプログラムがキャスト関数を備え、このキャスト関数により前記メソッドテーブルからＪａｖａメソッドの引数と戻り値の型を抽出し、引数と戻り値を、前記他プログラミング言語実行環境上でのデータフォーマットと前記ＪａｖａＶＭ上でのデータフォーマットに相互に変換するステップとをさらに備え、Ｊａｖａメソッドを呼び出す前後に前記キャスト関数を呼び出すステップをさらに備えることを特徴とする請求項５に記載のプログラミング言語間でのライブラリ変換プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、Ｒｕｂｙ等の他の言語で記述されたアプリケーションからＪａｖａ(サンマイクロシステムズ社の登録商標)ライブラリを利用するための、プログラミング言語間でのライブラリ変換方法及びプログラムに関するものである。
【背景技術】
【０００２】
近年、モバイル用のオープンソースオペレーティングシステムとしてＡｎｄｒｏｉｄ(グーグル社の登録商標)が登場し、様々なハードウェアに搭載されている。Ａｎｄｒｏｉｄ用のアプリケーションは、Ａｎｄｒｏｉｄ用のＪａｖａＶＭ(Java Vertual Machine)であるＤａｌｖｉｋＶＭ(Dalvik Vertual Machine)上で動作し、開発に用いる標準的なプログラミング言語はＪａｖａ（登録商標）である。ただし、他のプログラミング言語であっても実行環境をＡｎｄｒｏｉｄに移植すれば、Ｊａｖａ以外の言語でもＡｎｄｒｏｉｄ上で動作するアプリケーションを開発することは可能になる。
ただし、ＡｎｄｒｏｉｄはＷｉｎｄｏｗｓ（マイクロソフトコーポレーションの登録商標）やＬｉｎｕｘ等の既存のＯＳ１０５と異なり、加速度センサやＧＰＳ等、携帯端末向けの機能を有しており、全てＪａｖａのライブラリとして提供されているため、他のＯＳ上で動作する実行環境をＡｎｄｒｏｉｄに移植しただけでは、他の言語からはそれらの機能を利用することができない。
【０００３】
他の言語からＪａｖａのライブラリを利用するための方法としては、他の言語のソースコードをＪａｖａのソースコードに変換する方法と、他の言語で開発されたプログラムからＪａｖａのライブラリにアクセスする方法が考えられる。ＣＯＢＯＬのソースコードをＪａｖａのソースコードに変換する方法が、下記の特許文献１に記載されている。ただし、他の言語からＪａｖａのライブラリを利用する方法として、ソースコードの変換を行った場合、アプリケーションを動作させるためには、他の言語でソースコードを記述し、Ｊａｖａのソースコードに変換し、変換されたソースコードをコンパイルするという過程が必要になるため、アプリケーションの開発効率を大きく減じることになる。
他の言語で開発されたプログラムからＪａｖａのライブラリにアクセスする方法は、ＪａｖａＶＭが備える、ＪａｖａアプリケーションとＮａｔｉｖｅ言語で開発されたアプリケーション間で、相互にライブラリを利用するための手段である、ＪＮＩ(Java Native Interface)を利用することで実現できる。
ＪＮＩは、Ｊａｖａクラス名とＪａｖａメソッドの名前、引数と戻り値の型を与えれば、Ｊａｖａメソッドを呼び出すことができる。Ｃ＋＋のオブジェクトとＪａｖａのオブジェクトを、ＪＮＩを介してマッピングすることで、Ｃ＋＋プログラムがＪａｖａのガベージコレクション機能を利用する方法が、下記の特許文献２に記載されている。ただし、Ｎａｔｉｖｅ言語で、Ｊａｖａのメソッドを呼び出す処理を記述しなければならず、複数の言語での開発が必要となる。
【０００４】
スクリプト言語であるＲｕｂｙからＪＮＩを利用して、Ｊａｖａライブラリを利用するための技術として、Ｒｊｂ（RubyJavaBridge）が存在している。Ｒｊｂでは、Ｒｕｂｙアプリケーション実行中に、Ｒｕｂｙメソッド名や引数と戻り値の型を解析し、Ｊａｖａメソッドの名前、引数と戻り値の型に変換することで、Ｊａｖａメソッドを呼び出すＮａｔｉｖｅライブラリを予め用意することで、アプリケーション開発者がＲｕｂｙのみで、Ｊａｖａライブラリを利用するアプリケーションを開発することを可能にしている。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０１０−８６２１８公報
【特許文献２】特開２００５−６３４４９公報
【発明の開示】
【発明が解決しようとする課題】
【０００６】
しかしながら、上記Ｒｊｂのような方法では、プログラム実行中に、Ｒｕｂｙメソッドの引数や戻り値の型を解析する処理が必要になるため、ＲｕｂｙアプリケーションからＪａｖａメソッドを実行する時間は、Ｊａｖａアプリケーション上でのＪａｖａメソッド実行時間よりも大きくなってしまう。
【０００７】
本発明の目的は、ＪＮＩを利用して、他言語アプリケーションからＪａｖａメソッドを実行するために必要な時間を削減することが可能なライブラリ変換方法及びプログラムを提供することである。
【課題を解決するための手段】
【０００８】
前記の目的を達成するため、本発明に係るプログラミング言語間でのライブラリ変換方法は、Ｊａｖａクラス名、Ｊａｖａメソッド名、引数と戻り値の型を格納したテーブルを予め用意しておき、テーブルから取得したＪａｖａクラス名、Ｊａｖａメソッド名、引数と戻り値の型から、他言語アプリケーションの実行環境上に、Ｊａｖａメソッドを呼び出すためのメソッドを生成するように構成したものである。
具体的には、本発明に係るプログラミング言語間でのライブラリ変換方法は、ＯＳ（オペレーティングシステム）、ＪａｖａＶＭ、テーブル生成プログラム、ＪａｖａＡｒｃｈｉｖｅファイルを搭載するテーブル生成端末と、Ｊａｖａ以外の言語で開発されたアプリケーションを実行する他プログラミング言語実行環境と、キャストプログラム、ＪａｖａＶＭ、ＪａｖａＡｒｃｈｉｖｅファイルを搭載するアプリケーション実行端末から成るライブラリ変換環境におけるライブラリ変換方法であって、
前記テーブル生成プログラムが、前記ＪａｖａＡｒｃｈｉｖｅファイルを解析し、Ｊａｖａクラス名をクラステーブルに格納するステップと、Ｊａｖａメソッド名と引数の型と戻り値の型を格納するメソッドテーブルを生成するステップとを備え、
前記キャストプログラムがクラス登録関数及びメソッド登録関数を備え、前記クラス登録関数が前記クラステーブルからＪａｖａクラス名を抽出し、同名のクラスを前記他プログラミング言語実行環境に定義するステップと、前記メソッド登録関数が前記メソッドテーブルからＪａｖａメソッド名と引数の型と戻り値の型を抽出し、同名のＪａｖａメソッドを呼び出す関数を前記他プログラミング言語実行環境に定義するステップとを備えることを特徴とする。
また、前記テーブル生成プログラムが、前記クラステーブルにＪａｖａスーパークラスを特定する情報を格納するステップをさらに備え、
前記キャストプログラムが、前記クラステーブルからＪａｖａスーパークラスを特定する情報を抽出し、Ｊａｖａのクラス階層を前記他プログラミング言語実行環境上に反映するステップをさらに備えることを特徴とする。
また、前記キャストプログラムがキャスト関数を備え、このキャスト関数により前記メソッドテーブルからＪａｖａメソッドの引数と戻り値の型を抽出し、引数と戻り値を、前記他プログラミング言語実行環境上でのデータフォーマットと前記ＪａｖａＶＭ上でのデータフォーマットに相互に変換するステップとをさらに備え、Ｊａｖａメソッドを呼び出す前後に前記キャスト関数を呼び出すステップをさらに備えることを特徴とする。
【０００９】
また、本発明に係るプログラミング言語間でのライブラリ変換プログラムは、ＯＳ（オペレーティングシステム）、ＪａｖａＶＭ、テーブル生成プログラム、ＪａｖａＡｒｃｈｉｖｅファイルを搭載するテーブル生成端末と、Ｊａｖａ以外の言語で開発されたアプリケーションを実行する他プログラミング言語実行環境と、キャストプログラム、ＪａｖａＶＭ、ＪａｖａＡｒｃｈｉｖｅファイルを搭載するアプリケーション実行端末から成るライブラリ変換環境において実行されるプログラムであって、
前記テーブル生成プログラムが、前記ＪａｖａＡｒｃｈｉｖｅファイルを解析し、Ｊａｖａクラス名をクラステーブルに格納するステップと、Ｊａｖａメソッド名と引数の型と戻り値の型を格納するメソッドテーブルを生成するステップとを備え、
前記キャストプログラムがクラス登録関数及びメソッド登録関数を備え、前記クラス登録関数が前記クラステーブルからＪａｖａクラス名を抽出し、同名のクラスを前記他プログラミング言語実行環境に定義するステップと、前記メソッド登録関数が前記メソッドテーブルからＪａｖａメソッド名と引数の型と戻り値の型を抽出し、同名のＪａｖａメソッドを呼び出す関数を前記他プログラミング言語実行環境に定義するステップとを備えることを特徴とする。
また、前記テーブル生成プログラムが、前記クラステーブルにＪａｖａスーパークラスを特定する情報を格納するステップをさらに備え、
前記キャストプログラムが、前記クラステーブルからＪａｖａスーパークラスを特定する情報を抽出し、Ｊａｖａのクラス階層を前記他プログラミング言語実行環境上に反映するステップをさらに備えることを特徴とする。
また、前記キャストプログラムがキャスト関数を備え、このキャスト関数により前記メソッドテーブルからＪａｖａメソッドの引数と戻り値の型を抽出し、引数と戻り値を、前記他プログラミング言語実行環境上でのデータフォーマットと前記ＪａｖａＶＭ上でのデータフォーマットに相互に変換するステップとをさらに備え、Ｊａｖａメソッドを呼び出す前後に前記キャスト関数を呼び出すステップをさらに備えることを特徴とする。
【発明の効果】
【００１０】
本発明によれば、ＪＮＩを利用して、他言語アプリケーションから、Ｊａｖａメソッドを実行するために必要な時間を削減することができる。
【図面の簡単な説明】
【００１１】
【図１】本発明のプログラミング言語間でのライブラリ変換方法及びプログラムを実施するシステムの機能ブロック図である。
【図２】クラステーブル１１１の構成図である。
【図３】メソッドテーブル１１２の構成図である。
【図４】型テーブル１１３の構成図である。
【図５】テーブル生成プログラム１０１のクラステーブルとメソッドテーブル１１２生成処理を説明するためのフローチャートである。
【図６】ＪａｖａＡｒｃｈｉｖｅファイル１０２の解凍後のディレクトリ構成図である。
【図７】テーブル生成プログラム１０１によるクラステーブル生成処理を説明するフローチャートである。
【図８】テーブル生成プログラム１０１によるメソッドテーブル１１２生成処理を説明するためのフローチャートである。
【図９】テーブル生成プログラム１０１によるメソッドテーブル１１２へのコンストラクタ登録処理を説明するためのフローチャートである。
【図１０】テーブル生成プログラム１０１によるメソッドテーブル１１２へのメソッド登録処理を説明するためのフローチャートである。
【図１１】Ｒｕｂｙ実行端末１２０上のソフトウェアの機能詳細図である。
【図１２】ＲＤａｔａ構造体１１０３の構成図である。
【図１３】キャスト済みメソッドテーブル１２４０の構成図である。
【図１４】キャスト済みクラステーブル１１２５の構成図である。
【図１５】引数キャスト関数テーブル１１２６の構成図である。
【図１６】戻り値キャスト関数テーブル１１２７の構成図である。
【図１７】クラス登録関数１１２１によるＪａｖａクラスのＲｕｂｙクラスへの変換処理を説明するためのフローチャートである。
【図１８】図１７の続きを示すフローチャートである。
【図１９】Ｒｕｂｙアプリケーション１２１が、Ｊａｖａクラスから変換されたＲｕｂｙクラスのオブジェクト生成処理を説明するためのフローチャートである。
【図２０】メソッド登録関数１１２２によるＪａｖａメソッドのＲｕｂｙメソッドへの変換処理を説明するためのフローチャートである。
【図２１】Ｒｕｂｙアプリケーション１２１が、Ｊａｖａメソッドから変換されたＲｕｂｙメソッドを呼び出す処理を説明するためのフローチャートである。
【発明を実施するための形態】
【００１２】
以下、図面を参照して本発明の実施形態について説明する。
図１は、本発明のプログラミング言語間でのライブラリ変換方法及びプログラムを実現するためのシステムの機能ブロック図である。
図１のシステムは、テーブル生成端末１００、Ｒｕｂｙ実行端末１２０、ＪａｖａＡＰＩテーブル１１０からなる。
テーブル生成端末１００はＪａｖａＡＰＩテーブル１１０を生成する端末であり、ＯＳ１０５、ＪａｖａＶＭ１０３、テーブル生成プログラム１０１、ＪａｖａＡｒｃｈｉｖｅファイル１０２から成る。
ＪａｖａＡｒｃｈｉｖｅファイル１０２は、コンパイルされた複数のＪａｖａクラスファイルを一つにまとめ、圧縮したファイルである。
ＪａｖａＶＭ１０３は、Ｊａｖａ言語で開発されたプログラムを実行するプログラムであり、Ｊａｖａクラスローダー１０４が搭載されている。Ｊａｖａクラスローダー１０４は、Ｊａｖａクラスファイルを読み込み、ＪａｖａＶＭ１０３上で動作するプログラムが、Ｊａｖａクラスのメソッドを利用するための機能である。
【００１３】
Ｒｕｂｙ実行端末１２０は、Ｒｕｂｙ言語で開発されたＲｕｂｙアプリケーション１２１を実行する端末であり、ＡｎｄｒｏｉｄＯＳ１２６、ＤａｌｖｉｋＶＭ１２５１０３、ＪａｖａＡｒｃｈｉｖｅファイル１２４、Ｒｕｂｙインタプリタ１２２、キャストプログラム１２３、Ｒｕｂｙアプリケーション１２１から成る。
キャストプログラム１２３は、ＪａｖａＡＰＩテーブル１１０内の情報を読み取り、Ｊａｖａクラス・メソッドをＲｕｂｙクラス・メソッドに変換する処理を行うプログラムである。なお、Ｒｕｂｙアプリケーション１２１は、ＪａｖａＡＰＩの機能を利用する処理を含む。
ＪａｖａＡＰＩテーブル１１０は、クラステーブル１１１とメソッドテーブル１１２、型テーブル１１３から成る。
【００１４】
クラステーブル１１１の構成を図２に示す。
クラステーブル１１１は、１レコードに１つのＪａｖａクラスの情報が格納されるテーブルで、クラスＩＤ、クラス名、スーパークラスＩＤから成る。クラスＩＤは、Ｊａｖａクラスに一意に割り振られる値である。クラス名は、Ｊａｖａパッケージ名を含む完全修飾クラス名である。スーパークラスＩＤは、スーパークラスのクラスＩＤである。
図２の場合では、ａｎｄｒｏｉｄ／ｗｉｄｇｅｔ／ＴｅｘｔＶｉｅｗクラスのスーパークラスは、ａｎｄｒｏｉｄ／ｖｉｅｗ／Ｖｉｅｗクラスであるため、ａｎｄｒｏｉｄ／ｗｉｄｇｅｔ／ＴｅｘｔＶｉｅｗクラスのスーパークラスＩＤは１となる。また、Ｊａｖａ／ｌａｎｇ／Ｏｂｊｅｃｔクラスには、スーパークラスが存在しないため、スーパークラスＩＤには何も入らず、ｎｕｌｌと表記している。
【００１５】
メソッドテーブル１１２の構成を図３に示す。
メソッドテーブル１１２は、１レコードに１つのＪａｖａメソッドの情報が格納されるテーブルで、クラスＩＤ、メソッドＩＤ、メソッド名、シグネチャ、引数型ＩＤ、戻り値型ＩＤからなる。
メソッドＩＤは、Ｊａｖａメソッドに一意に割り振られる値である。
メソッド名は、Ｊａｖａメソッドの名前であり、コンストラクタは<ｉｎｉｔ>で表す。メソッドシグネチャは、メソッドを識別するために用いられる引数と戻り値の型のリストであり、ｊｍｅｔｈｏｄＩＤを得るために必要である。図３のｓｅｔＴｅｘｔメソッドの場合では、１つのｃｈａｒ配列型と２つのｉｎｔ型の引数を持ち、戻り値はｖｏｉｄであるため、([ＣＩＩ]Ｖとなる。引数型ＩＤは、引数の型と型テーブル１１３を関連付けるためのＩＤである。戻り値型ＩＤは、戻り値の型と型テーブル１１３を関連付けるためのＩＤである。
【００１６】
型テーブル１１３の構成を図４に示す。
型テーブル１１３は、変数のデータ型とシグネチャに一意の値を割り当てて格納したテーブルである。シグネチャは、メソッドシグネチャを生成するために必要である。
データ型がＪａｖａオブジェクトの場合、Ｌとクラス名と；を連結した文字列がシグネチャとなるが、このテーブルでは、先頭のＬのみを格納している。
データ型がｃｈａｒ配列型、ｉｎｔ型であれば、シグネチャは[Ｃ、Ｉで表される。
また、ａｎｄｒｏｉｄ／ｗｉｄｇｅｔ／Ｔｅｘｔｖｉｅｗクラスのオブジェクトの場合は、シグネチャはＬとなる。前記のメソッドテーブル１１２では、ｓｅｔＴｅｘｔメソッドの引数型ＩＤは、ｃｈａｒ配列型のＩＤである３とｉｎｔ型のＩＤである５が２つ、スラッシュで区切られて格納される。ｓｅｔＴｅｘｔメソッドの戻り値型ＩＤは、ｖｏｉｄのＩＤである０が入る。
【００１７】
図５は、テーブル生成プログラム１０１による、クラステーブル１１１とメソッドテーブル１１２生成処理のフローチャートである。
ステップＳ５０１では、ＪａｖａＡｒｃｈｉｖｅファイル１０２を解凍する。ＪａｖａＡｒｃｈｉｖｅファイル１０２の解凍後のディレクトリ構造の一例を図６に示す。
図６では、ＪａｖａＡｒｃｈｉｖｅファイル１０２には、ＴｅｘｔView．ｃｌａｓｓとＶｉｅｗ．ｃｌａｓｓ、Ｏｂｊｅｃｔ．ｃｌａｓｓの３つのクラスファイルが含まれている。
ステップＳ５０１の後は、図７に示すクラステーブル１１１の生成フローチャートと図８に示すメソッドテーブル１１２の生成フローチャートに進む。
【００１８】
図７は、テーブル生成プログラム１０１によるクラステーブル１１１の生成処理のフローチャートである。
ステップＳ７０１では、テーブル生成プログラム１０１が、ステップＳ５０１で解凍、生成されたＪａｖａクラスファイルの、解凍後のディレクトリ構造のtopディレクトリからの相対パスを取得する。図６の例では、ＴｅｘｔＶｉｅｗ．ｃｌａｓｓの相対パスは、ａｎｄｒｏｉｄ／ｗｉｄｇｅｔ／ＴｅｘｔＶｉｅｗ．ｃｌａｓｓとなる。
ステップＳ７０２では、テーブル生成プログラム１０１が、ステップＳ７０１で取得したＪａｖａクラスファイルの相対パスから拡張子である.ｃｌａｓｓを取り除いて、クラス名を生成する。図６の例では、相対パスのａｎｄｒｏｉｄ／ｗｉｄｇｅｔ／ＴｅｘｔＶｉｅｗ．ｃｌａｓｓから拡張子を取り除き、クラス名ａｎｄｒｏｉｄ／ｗｉｄｇｅｔ／ＴｅｘｔＶｉｅｗを生成する。
【００１９】
ステップＳ７０３では、テーブル生成プログラム１０１が、クラステーブル１１１からステップＳ７０２で取得したクラス名を検索する。同じクラス名が既に存在する場合は、検索にヒットしたレコードのクラスＩＤを抽出し、ステップＳ７０４に進み、存在しない場合は、ステップＳ７０４に進む。
ステップＳ７０４では、テーブル生成プログラム１０１が、ステップＳ７０２で生成したクラス名にクラスＩＤを割り当て、クラステーブル１１１に格納する。図２の例では、ａｎｄｒｏｉｄ／ｗｉｄｇｅｔ／ＴｅｘｔＶｉｅｗクラスに、クラスＩＤとして２を割り当てて、クラステーブル１１１に格納している。
【００２０】
ステップＳ７０５では、Ｊａｖａクラスローダー１０４が、ステップＳ７０２で生成したクラス名のＪａｖａクラスファイルを読み込み、Ｊａｖａクラスオブジェクトを生成する。Ｊａｖａクラスオブジェクトは、ｊａｖａ／ｌａｎｇ／Ｃｌａｓｓクラスのオブジェクトであり、特定のＪａｖａクラスのシグネチャ、メソッドやスーパークラスの情報の取得やアクセスを行うための機能を備える。
ステップＳ７０６では、テーブル生成プログラム１０１が、ステップＳ７０５で生成したＪａｖａクラスオブジェクトからスーパークラスのＪａｖａクラスオブジェクトを取得し、スーパークラスのＪａｖａクラスオブジェクトからスーパークラス名を取得する。
ａｎｄｒｏｉｄ／ｗｉｄｇｅｔ／ＴｅｘｔＶｉｅｗクラスのスーパークラスがａｎｄｒｏｉｄ／ｖｉｅｗ／Ｖｉｅｗクラスである場合、ａｎｄｒｏｉｄ／ｗｉｄｇｅｔ／ＴｅｘｔＶｉｅｗクラスのＪａｖａクラスオブジェクトから、ａｎｄｒｏｉｄ／ｖｉｅｗ／ＶｉｅｗクラスのＪａｖａクラスオブジェクトが取得でき、ａｎｄｒｏｉｄ／ｖｉｅｗ／ＶｉｅｗクラスのＪａｖａクラスオブジェクトからクラス名を表すａｎｄｒｏｉｄ／ｖｉｅｗ／Ｖｉｅｗ文字列を取得することができる。
【００２１】
ステップＳ７０７では、ステップＳ７０６でスーパークラス名が取得できた場合は、ステップＳ７０８に進み、取得できなかった場合は、処理を終了する。
ステップＳ７０８では、テーブル生成プログラム１０１が、クラステーブル１１１からステップＳ７０６で取得したスーパークラス名を検索する。同じクラス名が既に存在する場合は、ステップＳ７１０に進み、存在しない場合は、ステップＳ７０９に進む。
ａｎｄｒｏｉｄ／ｗｉｄｇｅｔ／ＴｅｘｔＶｉｅｗクラスの場合では、スーパークラスであるａｎｄｒｏｉｄ／ｖｉｅｗ／Ｖｉｅｗクラスが、図２に示すように既にクラステーブル１１１に存在する場合、ステップＳ７１０に進む。
【００２２】
ステップＳ７０９では、テーブル生成プログラム１０１が、ステップＳ７０６で取得したスーパークラス名にクラスＩＤを割り当て、クラステーブル１１１に格納する。
ステップＳ７１０では、テーブル生成プログラム１０１が、ステップＳ７０８で検索にヒットしたレコードからクラスＩＤを抽出する。図２の例では、ａｎｄｒｏｉｄ／ｖｉｅｗ／Ｖｉｅｗクラスのクラス名を持つレコードのクラスＩＤである１を抽出する。
【００２３】
ステップＳ７１１では、テーブル生成プログラム１０１が、クラステーブル１１１にステップＳ７０９で割り当てたクラスＩＤもしくはステップＳ７１０で抽出したクラスＩＤを、スーパークラスＩＤとして、クラステーブル１１１に格納する。図２の例では、ａｎｄｒｏｉｄ／ｗｉｄｇｅｔ／ＴｅｘｔＶｉｅｗのスーパークラスＩＤに、ステップＳ７１０で抽出したクラスＩＤ１を格納している。
【００２４】
図８は、テーブル生成プログラム１０１によるメソッドテーブル１１２生成処理のフローチャートである。
メソッドテーブル１１２の生成処理は図９のコンストラクタ登録処理と図１０のメソッド登録処理からなる。
【００２５】
図９は、テーブル生成プログラム１０１によるメソッドテーブル１１２へのコンストラクタ登録処理のフローチャートである。
ステップＳ９０１では、ステップＳ７０５で取得したＪａｖａクラスオブジェクトからコンストラクタオブジェクトを取得する。コンストラクタオブジェクトは、Ｊａｖａクラスのコンストラクタの情報とコール機能を提供するオブジェクトであり、ｊａｖａ／ｌａｎｇ／Ｃｌａｓｓクラスのメソッドにより、取得できる。
ステップＳ９０２では、ステップＳ９０１で取得したコンストラクタオブジェクトから引数クラスオブジェクトを取得する。引数クラスオブジェクトとは、メソッドもしくはコンストラクタの引数となるＪａｖａクラスのＪａｖａクラスオブジェクトである。なお、引数の型が、ｂｏｏｌｅａｎ、ｂｙｔｅ、ｃｈａｒ配列、ｓｈｏｒｔ、ｉｎｔ、ｌｏｎｇ、ｆｌｏａｔ、ｄｏｕｂｌｅ、ｖｏｉｄであり、Ｊａｖａクラスで無い場合でも、Ｊａｖａクラスオブジェクトとして扱うことができる。ａｎｄｒｏｉｄ／ｗｉｄｇｅｔ／ＴｅｘｔＶｉｅｗクラスのコンストラクタの引数の型を、ａｎｄｒｏｉｄ／ｃｏｎｔｅｎｔ／Ｃｏｎｔｅｘｔクラスとすると、ステップＳ９０２では、ａｎｄｒｏｉｄ／ｃｏｎｔｅｎｔ／ＣｏｎｔｅｘｔクラスのＪａｖａクラスオブジェクトを取得できる。
【００２６】
ステップＳ９０３では、ステップＳ９０２で取得した引数クラスオブジェクトから引数のシグネチャを取得する。ａｎｄｒｏｉｄ／ｃｏｎｔｅｎｔ／ＣｏｎｔｅｘｔクラスのＪａｖａクラスオブジェクトからは、Ｌａｎｄｒｏｉｄ／ｃｏｎｔｅｎｔ／Ｃｏｎｔｅｘｔ；を文字列として取得することができる。
ステップＳ９０４では、ステップＳ９０３で取得した引数のシグネチャを、型ＩＤテーブルのシグネチャを参照して、引数型ＩＤに変換する。引数が複数ある場合は、／を加えて連結する。引数のシグネチャが、Ｌａｎｄｒｏｉｄ／ｃｏｎｔｅｎｔ／Ｃｏｎｔｅｘｔ；の場合、型ＩＤは９となる。
【００２７】
ステップＳ９０５では、ステップＳ９０３で取得した引数のシグネチャからメソッドシグネチャを生成する。メソッドシグネチャのフォーマットは（[引数のシグネチャ]）[戻り値のシグネチャであり、Ｊａｖａメソッド呼出関数１１１３ではコンストラクタの戻り値はＶｏｉｄ型として扱われ、シグネチャはＶとなるため、ａｎｄｒｏｉｄ／ｗｉｄｇｅｔ／ＴｅｘｔＶｉｅｗクラスのコンストラクタのメソッドシグネチャは、図３に示すように（Ｌａｎｄｒｏｉｄ／ｃｏｎｔｅｎｔ／Ｃｏｎｔｅｘｔ；）Ｖとなる。
【００２８】
ステップＳ９０６では、コンストラクタにメソッドＩＤを割り当て、ステップＳ７０３で抽出したクラスＩＤ、またはステップＳ７０４で割り当てたクラスＩＤと、メソッドＩＤと、ステップＳ９０５で生成したメソッドシグネチャと、ステップＳ９０４で変換した引数型ＩＤと、Ｖｏｉｄ型の戻り値型ＩＤをメソッドテーブル１１２に格納する。
【００２９】
ａｎｄｒｏｉｄ／ｗｉｄｇｅｔ／ＴｅｘｔＶｉｅｗクラスのコンストラクタの場合は、図３のように、メソッドＩＤとして１を割り当て、ａｎｄｒｏｉｄ／ｗｉｄｇｅｔ／ＴｅｘｔＶｉｅｗクラスのクラスＩＤである２と、メソッドＩＤとして１と、コンストラクタを表すメソッド名＜ｉｎｉｔ＞と、メソッドシグネチャ（Ｌａｎｄｒｏｉｄ／ｃｏｎｔｅｎｔ／Ｃｏｎｔｅｘｔ；）Ｖと、引数型ＩＤとして９と、戻り値型ＩＤとして０を格納する。
【００３０】
図１０は、テーブル生成プログラム１０１によるメソッドテーブル１１２へのメソッド登録処理のフローチャートである。
ステップＳ１００１では、ステップＳ７０５で取得したＪａｖａクラスオブジェクトからＪａｖａメソッドオブジェクトを取得する。Ｊａｖａメソッドオブジェクトは、Ｊａｖａメソッドの情報とコール機能を提供するオブジェクトであり、ｊａｖａ／ｌａｎｇ／Ｃｌａｓｓクラスのメソッドにより取得できる。
図３に示したａｎｄｒｏｉｄ／ｗｉｄｇｅｔ／ＴｅｘｔＶｉｅｗクラスの場合では、ｇｅｔＴｅｘｔメソッドとｓｅｔＴｅｘｔメソッドのＪａｖａメソッドオブジェクトが取得できる。
【００３１】
ステップＳ１００２では、ステップＳ１００１で取得したＪａｖａメソッドオブジェクトからメソッド名を取得する。前記ｓｅｔＴｅｘｔメソッドのＪａｖａメソッドオブジェクトからは、ｓｅｔＴｅｘｔ文字列を取得できる。
ステップＳ１００３では、ステップＳ１００１で取得したＪａｖａメソッドオブジェクトから引数クラスオブジェクトを取得する。前記ｓｅｔＴｅｘｔメソッドの場合では、ｃｈａｒ配列型のＪａｖａクラスオブジェクトとｉｎｔ型のＪａｖａクラスオブジェクト２つが取得できる。
【００３２】
ステップＳ１００４では、ステップＳ１００３で取得した引数クラスオブジェクトから引数のシグネチャを取得する。前記ｓｅｔＴｅｘｔメソッドの場合では、ｃｈａｒ配列型を表すＣと、ｉｎｔ型を表すＩを２つ取得できる。
ステップＳ１００５では、ステップＳ１００４で取得した引数のシグネチャを、型ＩＤテーブルのシグネチャを参照して、引数型ＩＤに変換する。前記ｓｅｔＴｅｘｔメソッドの場合では、引数のシグネチャはＣと２つのＩであり、引数型ＩＤは３／５／５となる。
【００３３】
ステップＳ１００６では、ステップＳ１００１で取得したＪａｖａメソッドオブジェクトから戻り値クラスオブジェクトを取得する。戻り値クラスオブジェクトとは、メソッドの戻り値となるＪａｖａクラスのＪａｖａクラスオブジェクトである。
ステップＳ１００７では、ステップＳ１００６で取得した戻り値クラスオブジェクトから戻り値のシグネチャを取得する。前記ｓｅｔＴｅｘｔメソッドの場合では、ｖｏｉｄ型を表すＶを取得できる。
ステップＳ１００８では、ステップＳ１００７で取得した戻り値のシグネチャを、型ＩＤテーブルのシグネチャを参照して、戻り値型ＩＤに変換する。前記ｓｅｔＴｅｘｔメソッドの場合では、戻り値のシグネチャはＶであり、戻り値型ＩＤは０となる。
【００３４】
ステップＳ１０１０では、ステップＳ１００４で取得した引数のシグネチャとステップＳ１００７で取得した戻り値のシグネチャからメソッドシグネチャを生成する。前記ｓｅｔＴｅｘｔメソッドの場合では、（[ＣＩＩ]Ｖとなる。
ステップＳ１０１１では、メソッドにメソッドＩＤを割り当て、ステップＳ７０３で抽出したクラスＩＤ、またはステップＳ７０４で割り当てたクラスＩＤと、メソッドＩＤと、ステップＳ１０１０で生成したメソッドシグネチャと、ステップＳ１００５で変換した引数型ＩＤと、ステップＳ１００８で取得した戻り値型ＩＤをメソッドテーブル１１２に格納する。
【００３５】
前記ｓｅｔＴｅｘｔメソッドの場合では、図３のように、メソッドＩＤとして２を割り当て、ａｎｄｒｏｉｄ／ｗｉｄｇｅｔ／ＴｅｘｔＶｉｅｗクラスのクラスＩＤである２と、メソッドＩＤとして２と、メソッド名ｓｅｔＴｅｘｔと、メソッドシグネチャ（[CII）Ｖと、引数型ＩＤとして３／５／５と、戻り値型ＩＤとして０を格納する。
【００３６】
図１１は、Ｒｕｂｙ実行端末１２０上のＲｕｂｙインタプリタ１２２、キャストプログラム１２３、ＤａｌｖｉｋＶＭ１２５の機能構成図である。
Ｒｕｂｙインタプリタ１２２は、Ｒｕｂｙ拡張ライブラリ１１００を備える。Ｒｕｂｙ拡張ライブラリ１１００はＮａｔｉｖｅ言語からＲｕｂｙにクラスとメソッドを追加する機能を提供するライブラリであり、クラス追加関数１１０１とメソッド追加関数１１０２とＲＤａｔａ構造体１１０３を含む。クラス追加関数１１０１とメソッド追加関数１１０２は、それぞれＲｕｂｙインタプリタ１２２上にＲｕｂｙクラスとＲｕｂｙメソッドを追加する機能を有する。ＲＤａｔａ構造体１１０３は、ＲｕｂｙクラスとＲｕｂｙオブジェクトの実体である。
【００３７】
ＲＤａｔａ構造体１１０３の構成を図１２に示す。本実施形態では、ＪａｖａクラスのＲｕｂｙクラスへの変換のために、ＲＤａｔａ構造体１１０３のメンバにｒｃｌａｓｓ構造体１２１０を追加している。＊はポインタを表し、＊ｒｃｌａｓｓ１２０１はｒｃｌａｓｓのポインタである。ｒｃｌａｓｓ構造体１２１０のメンバには、＊ｒｃｏｎｓｔｒｕｃｔｏｒ１２１１、ｒｍｅｔｈｏｄ配列、ｊｏｂｊｅｃｔ１２１３、ｊｃｌａｓｓ１２１４、＊キャスト済みメソッドテーブル１２１５、クラスＩＤが含まれる。
＊ｒｃｏｎｓｔｒｕｃｔｏｒ１２１１は、ｒｃｏｎｓｔｒｕｃｔｏｒ構造体１２２０へのポインタである。ｒｃｏｎｓｔｒｕｃｔｏｒ構造体１２２０は、Ｊａｖａクラスから変換されたＲｕｂｙクラスのコンストラクタの処理に必要な値と関数をメンバに持つ構造体であり、＊ｃａｒｇｓ配列１２２１、＊ｃａｒｇｃａｓｔ関数配列１２２２、ｊｍｅｔｈｏｄＩＤ１２２３がメンバである。
【００３８】
ｃａｒｇｓ配列は、Ｒｕｂｙコンストラクタとしてキャストコンストラクタ関数１１２３が受け取った引数をＤａｌｖｉｋＶＭ１２５のデータフォーマットに変換した値を格納する配列である。ｃａｒｇｃａｓｔ関数配列は、Ｒｕｂｙコンストラクタとしてキャストコンストラクタ関数１１２３が受け取った引数をＤａｌｖｉｋＶＭ１２５のデータフォーマットに変換する関数であるキャスト関数を格納する配列である。
ｊｍｅｔｈｏｄＩＤ１２２３は、Ｊａｖａのコンストラクタのポインタである。
ｒｍｅｔｈｏｄ構造体１２３０は、Ｊａｖａメソッドから変換されたＲｕｂｙメソッドであり、Ｒｕｂｙアプリケーション１２１が、Ｊａｖａメソッドを呼び出すために必要な値と関数をメンバに持つ構造体であり、＊ｍａｒｇｓ配列１２３１、＊ｍａｒｇｃａｓｔ関数配列１２３２、＊ｒｅｔｕｒｎｃａｓｔ関数１２３３、ｊｍｅｔｈｏｄＩＤ１２３４がメンバである。
【００３９】
ｍａｒｇｓ配列は、Ｒｕｂｙメソッドとしてｊｍｅｔｈｏｄ＿ｍｉｓｓｉｎｇ関数１１２４が受け取った引数をＤａｌｖｉｋＶＭ１２５のデータフォーマットに変換した値を格納する配列である。
ｍａｒｇｃａｓｔ関数配列は、Ｒｕｂｙメソッドとしてｊｍｅｔｈｏｄ＿ｍｉｓｓｉｎｇ関数１１２４が受け取った引数をＤａｌｖｉｋＶＭ１２５のデータフォーマットに変換する関数であるキャスト関数を格納する配列である。
ｒｅｔｕｒｎｃａｓｔ関数は、Ｊａｖａメソッドの戻り値をＲｕｂｙインタプリタ１２２のデータフォーマットに変換する関数であるキャスト関数である。
【００４０】
ｊｍｅｔｈｏｄＩＤ１２３４は、Ｊａｖａメソッドのポインタである。
ｊｏｂｊｅｃｔ１２１３は、Ｊａｖａオブジェクトへのポインタである。
ｊｃｌａｓｓ１２１４は、Ｊａｖａクラスオブジェクトへのポインタである。
キャスト済みメソッドテーブル１２４０は、メソッドテーブル１１２からｒｍｅｔｈｏｄ構造体１２３０のインスタンスを生成済みのメソッドを格納するテーブルである。
【００４１】
キャスト済みメソッドテーブル１２４０の一例を図１３に示す。
メソッド番号はｒｍｅｔｈｏｄ配列の位置であり、Ｒｍｅｔｈｏｄ構造体１２３０のインスタンスの重複生成を防止すると同時に、メソッド名と対応するｒｍｅｔｈｏｄ構造体１２３０のインスタンスを検索する目的も持つ。図１３の場合では、ｇｅｔＴｅｘｔメソッドが既にＲｍｅｔｈｏｄ構造体１２３０に変換済みである。
ＲＤａｔａ構造体１１０３インスタンス、ｒｃｌａｓｓ構造体１２１０インスタンス、ｒｃｏｎｓｔｒｕｃｔｏｒ構造体１２２０インスタンスは、Ｊａｖａクラスから変換されたＲｕｂｙクラス一つ毎に生成される。また、ｒｍｅｔｈｏｄ構造体１２３０のインスタンスは、Ｊａｖａメソッドの数だけ生成される。
【００４２】
キャストプログラム１２３は、クラス登録関数１１２１、メソッド登録関数１１２２、キャストコンストラクタ関数１１２３、ｊｍｅｔｈｏｄ＿ｍｉｓｓｉｎｇ関数１１２４、キャスト済みクラステーブル１１２５、引数キャスト関数テーブル１１２６、戻り値キャスト関数テーブル１１２７を備える。
【００４３】
クラス登録関数１１２１は、クラステーブル１１１内にあるＪａｖａクラスを、Ｒｕｂｙクラスに変換する機能を有する。
メソッド登録関数１１２２は、メソッドテーブル１１２内にあるＪａｖａメソッドを、Ｒｕｂｙメソッドに変換する機能を有する。キャストコンストラクタ関数１１２３は、Ｊａｖａクラスから変換された全てのＲｕｂｙクラスのコンストラクタであり、Ｊａｖａオブジェクトを格納するＲｕｂｙオブジェクトを生成する機能を有する。
ｊｍｅｔｈｏｄ＿ｍｉｓｓｉｎｇ関数１１２４は、Ｊａｖａクラスから変換されたすべてのＲｕｂｙクラスのｍｅｔｈｏｄ＿ｍｉｓｓｉｎｇメソッドであり、呼び出されたＲｕｂｙメソッドの名前と同名のＪａｖａメソッドを呼び出す機能を有する。
【００４４】
Ｒｕｂｙのｍｅｔｈｏｄ＿ｍｉｓｓｉｎｇメソッドは、Ｒｕｂｙアプリケーション１２１が存在しないメソッドａを呼び出した時に呼び出されるメソッドであり、Ｒｕｂｙアプリケーション１２１からメソッドの呼出元のＲｕｂｙオブジェクト、メソッド名ａ、メソッドａの引数を受け取り、処理を行う。
キャスト済みクラステーブル１１２５は、クラス登録関数１１２１により、Ｊａｖａクラスから変換されたＲｕｂｙクラスを格納するテーブルであり、クラスの変換処理を重複して行うことを防ぐ目的がある。
【００４５】
キャスト済みクラステーブル１１２５の一例を図１４に示す。図１４の場合では、ｊａｖａ／ｌａｎｇ／Ｏｂｊｅｃｔクラスとａｎｄｒｏｉｄ／ｖｉｅｗ／Ｖｉｅｗクラスが既にＲｕｂｙクラスに変換済みである。
引数キャスト関数テーブル１１２６は、Ｒｕｂｙインタプリタ１２２のデータフォーマットを持つ値をＤａｌｖｉｋＶＭ１２５１０３のデータフォーマットの値に変換するキャスト関数のポインタを格納している。
【００４６】
引数キャスト関数テーブル１１２６の一例を図１５に示す。テーブル中の型ＩＤは、キャスト関数が変換する値の型ＩＤである。戻り値キャスト関数テーブル１１２７は、ＤａｌｖｉｋＶＭ１２５のデータフォーマットを持つ値をＲｕｂｙインタプリタ１２２のデータフォーマットの値に変換するキャスト関数のポインタを格納している。
【００４７】
戻り値キャスト関数テーブル１１２７の一例を図１６に示す。テーブル中の型ＩＤは、キャスト関数が変換する値の型ＩＤである。引数キャスト関数テーブル１１２６と戻り値キャスト関数テーブル１１２７は、Ｒｕｂｙインタプリタ１２２起動時に作成する。
ＪＮＩライブラリ１１１０は、Ｎａｔｉｖｅ言語からＪａｖａクラスローダー１０４を利用する機能を提供するライブラリであり、Ｊａｖａクラス取得関数１１１１、Ｊａｖａメソッド取得関数１１１２、Ｊａｖａメソッド呼出関数１１１３を含む。
Ｊａｖａクラス取得関数１１１１は、Ｊａｖａクラスローダー１０４を利用して、Ｊａｖａクラスオブジェクトを生成し、Ｊａｖａクラスオブジェクトのポインタであるｊｃｌａｓｓ１２１４を取得する機能を有する。
Ｊａｖａメソッド取得関数１１１２は、Ｊａｖａクラスローダー１０４を利用して、ＪａｖａメソッドのポインタであるｊｍｅｔｈｏｄＩＤ１２２３、１２３４を取得する機能を有する。
Ｊａｖａメソッド呼出関数１１１３は、ｊｍｅｔｈｏｄＩＤ１２２３、１２３４の示すＪａｖａメソッドを呼び出す機能を有する。
【００４８】
図１７は、クラス登録関数１１２１によるクラス名ＡのＪａｖａクラスのＲｕｂｙクラスへの変換処理のフローチャートである。
ステップＳ１７０１では、クラス登録関数１１２１が、キャスト済みクラステーブル１１２５１１２５からクラス名Ａを検索する。キャスト済みクラステーブル１１２５にクラス名Ａが存在する場合は、処理を終了し、存在しない場合は、ステップＳ１７０２に進む。
ステップＳ１７０２では、クラス登録関数１１２１が、クラステーブル１１１からクラス名Ａを検索し、クラスＩＤとスーパークラスＩＤを抽出する。ａｎｄｒｏｉｄ／ｗｉｄｇｅｔ／ＴｅｘｔＶｉｅｗクラスを変換する場合では、クラステーブル１１１からクラスＩＤ２とスーパークラスＩＤ１が抽出される。
【００４９】
ステップＳ１７０３では、ステップＳ１７０２でスーパークラスＩＤが抽出された場合、ステップＳ１７０４に進み、存在しなかった場合、ステップＳ１７０６に進む。
ステップＳ１７０４では、クラス登録関数１１２１が、クラステーブル１１１のクラスＩＤに対し、ステップＳ１７０３で抽出したスーパークラスＩＤを検索し、スーパークラスのクラス名ＳＡを抽出し、クラス名ＳＡのＪａｖａクラスのＲｕｂｙクラスへの変換処理を行い、ステップＳ１７０５に進む。
ａｎｄｒｏｉｄ／ｗｉｄｇｅｔ／ＴｅｘｔＶｉｅｗクラスの場合、クラステーブル１１１のクラスＩＤ１のレコードが検索にヒットし、クラス名ａｎｄｒｏｉｄ／ｖｉｅｗ／Ｖｉｅｗが抽出される。
【００５０】
ステップＳ１７０５では、クラス登録関数１１２１が、ｒｃｌａｓｓ構造体１２１０のメモリ領域を確保し、ｒｃｌａｓｓ構造体１２１０のインスタンスを生成し、ステップＳ１７０２で抽出したクラスＩＤを１２１６に格納する。
ステップＳ１７０６では、クラス登録関数１１２１が、クラス名Ａを引数に、Ｊａｖａクラス取得関数１１１１を呼び出し、Ｊａｖａクラスオブジェクトを生成し、ｊｃｌａｓｓ１２１４を取得し、ｒｃｌａｓｓ構造体１２１０のインスタンスに格納する。
【００５１】
ステップＳ１７０７では、クラス登録関数１１２１が、メソッドテーブル１１２から、ステップＳ１７０２で抽出したクラスＩＤとコンストラクタを表すメソッド名＜ｉｎｉｔ＞を検索し、メソッドシグネチャと引数型ＩＤを抽出する。
ａｎｄｒｏｉｄ／ｗｉｄｇｅｔ／ＴｅｘｔＶｉｅｗクラスの場合、メソッドテーブル１１２からクラスＩＤ２とメソッド名＜ｉｎｉｔ＞を検索し、メソッドシグネチャ(Ｌａｎｄｒｏｉｄ／ｃｏｎｔｅｎｔ／Ｃｏｎｔｅｘｔ)；Ｖと引数型ＩＤ９を抽出する。
【００５２】
ステップＳ１７０８では、クラス登録関数１１２１が、メソッド名＜ｉｎｉｔ＞とメソッドシグネチャを引数に、Ｊａｖａメソッド取得関数１１１２を呼び出し、ｊｍｅｔｈｏｄＩＤを取得する。
ステップＳ１７０９では、クラス登録関数１１２１が、ｒｃｏｎｓｔｒｕｃｔｏｒ構造体１２２０のメモリ領域を確保し、ｒｃｏｎｓｔｒｕｃｔｏｒ構造体１２２０のインスタンスを生成し、ｊｍｅｔｈｏｄＩＤを格納する。
【００５３】
ステップＳ１７１０では、クラス登録関数１１２１が、ステップＳ１７０７で抽出した引数型ＩＤを引数キャスト関数テーブル１１２６から検索し、キャスト関数ポインタを抽出する。引数が複数ある場合、キャスト関数ポインタも複数抽出される。
ａｎｄｒｏｉｄ／ｗｉｄｇｅｔ／ＴｅｘｔＶｉｅｗクラスの場合、引数型ＩＤは９であるため、*ｊ２ｒｏｂｊｅｃｔが抽出される。
ステップＳ１７１１では、クラス登録関数１１２１が、ステップＳ１７０９で生成したＲｒｃｏｎｓｔｒｕｃｔｏｒ構造体１２２０のインスタンスのｃａｒｇｃａｓｔ関数配列に、ステップＳ１７１０で抽出したキャスト関数ポインタを格納する。
【００５４】
ステップＳ１７１２では、クラス登録関数１１２１が、ＲＤａｔａ構造体１１０３のメモリ領域を確保し、ＲＤａｔａ構造体１１０３のインスタンスを生成し、ステップＳ１７０５で生成したｒｃｌａｓｓ構造体１２１０のインスタンスのポインタを格納する。
ステップＳ１７１３では、ステップＳ１７０２でスーパークラスＩＤが抽出された場合、ステップＳ１７１４に進み、存在しなかった場合、ステップＳ１７１５に進む。
【００５５】
ステップＳ１７１４では、クラス登録関数１１２１が、ステップＳ１７０４で抽出されたクラス名ＳＡを持つＲｕｂｙクラスのサブクラスとして、ステップＳ１７１２で生成されたＲＤａｔａ構造体１１０３のインスタンスをクラス名ＡのＲｕｂｙクラスに登録する。
【００５６】
ステップＳ１７１５では、クラス登録関数１１２１が、ＲｕｂｙのＯｂｊｅｃｔクラスのサブクラスとして、ステップＳ１７１２で生成されたＲＤａｔａ構造体１１０３のインスタンスをクラス名ＡのＲｕｂｙクラスに登録する。ＲｕｂｙのＯｂｊｅｃｔクラスは、Ｒｕｂｙのクラス階層のルートに存在するクラスであり、Ｏｂｊｅｃｔクラスにスーパークラスは存在しない。
ステップＳ１７１６では、クラス登録関数１１２１が、キャスト済みクラステーブル１１２５にクラス名Ａを格納する。
【００５７】
ステップＳ１７１７では、クラス登録関数１１２１が、メソッド追加関数１１０２を呼び出し、クラス名ＡのＲｕｂｙクラスのコンストラクタに、キャストコンストラクタ関数１１２３のポインタを登録する。
ステップＳ１７１８では、クラス登録関数１１２１が、メソッド追加関数１１０２を呼び出し、クラス名ＡのＲｕｂｙクラスのｍｅｔｈｏｄ＿ｍｉｓｓｉｎｇメソッドにｊｍｅｔｈｏｄ＿ｍｉｓｓｉｎｇ関数１１２４のポインタを登録する。
【００５８】
図１９は、ＪａｖａクラスのＲｕｂｙクラスへの変換処理により登録されたＲｕｂｙクラスのオブジェクト生成処理のフローチャートである。
本フローチャートは、Ｒｕｂｙアプリケーション１２１実行時に、ＪａｖａクラスのＲｕｂｙクラスへの変換処理により登録されたＲｕｂｙクラスのコンストラクタが呼び出された時に開始される。
ステップＳ１９０１では、キャストコンストラクタ関数１１２３が、Ｒｕｂｙインタプリタ１２２からＲｕｂｙコンストラクタの引数と、Ｒｕｂｙコンストラクタの呼出元のＲｕｂｙクラスとして登録されているＲＤａｔａ構造体１１０３のインスタンスを取得する。Ｊａｖａのａｎｄｒｏｉｄ／ｗｉｄｇｅｔ／ＴｅｘｔＶｉｅｗクラスを変換したＲｕｂｙクラスのコンストラクタの場合では、Ｒｕｂｙインタプリタ１２２上では、Ｊａｖａのａｎｄｒｏｉｄ／ｃｏｎｔｅｎｔ／Ｃｏｎｔｅｘｔクラスを変換したＲｕｂｙクラスのオブジェクトを引数として受け取り、呼び出される。
【００５９】
ステップＳ１９０２では、キャストコンストラクタ関数１１２３が、ステップＳ１９０１で取得した引数を渡して、ステップＳ１９０１で取得したＲＤａｔａ構造体１１０３のインスタンスからｊｃｏｎｓｔｒｕｃｔｏｒ構造体１２２０のｃａｒｇｃａｓｔ関数配列を取得し、ステップＳ１７１１でｃａｒｇｃａｓｔ関数配列に格納されたポインタが示すキャスト関数を呼び出し、戻り値であるｊｏｂｊｅｃｔ１２１３をステップＳ１９０１で取得したＲＤａｔａ構造体１１０３のインスタンスからｊｃｏｎｓｔｒｕｃｔｏｒ構造体１２２０のａｒｇｓ配列１２２１に格納する。
引数が複数ある場合、ｃａｒｇｃａｓｔ関数配列１２２２にもキャスト配列のポインタが複数格納されており、それぞれの引数を対応したキャスト関数に渡して呼び出し、戻り値を全てｃａｒｇｓ配列１２２１に格納する。
ａｎｄｒｏｉｄ／ｗｉｄｇｅｔ／ＴｅｘｔＶｉｅｗクラスを変換したＲｕｂｙクラスのコンストラクタの場合では、ｒ２ｊｏｂｊｅｃｔが呼び出され、ａｎｄｒｏｉｄ／ｃｏｎｔｅｎｔ／Ｃｏｎｔｅｘｔクラスを変換したＲｕｂｙクラスのオブジェクトからＪａｖａオブジェクトのポインタを取得し、ｃａｒｇｓ配列１２２１に格納する。
【００６０】
ステップＳ１９０３では、キャストコンストラクタ関数１１２３が、ステップＳ１９０２でａｒｇｓ配列に格納された戻り値を引数として渡し、ステップＳ１９０１で取得したＲＤａｔａからｊｃｏｎｓｔｒｕｃｔｏｒ構造体１２２０のｊｍｅｔｈｏｄＩＤ１２２３の示すＪａｖａコンストラクタを呼び出し、戻り値としてｊｏｂｊｅｃｔを取得する。
ステップＳ１９０３では、キャストコンストラクタ関数１１２３が、ステップＳ１９０１で取得したＲＤａｔａ構造体１１０３のメンバであるｒｃｌａｓｓ構造体１２１０に、ステップＳ１９０３で取得したｊｏｂｊｅｃｔ１２１３を格納する。
【００６１】
ステップＳ１９０４では、キャストコンストラクタ関数１１２３が、ステップＳ１９０１で取得したＲＤａｔａ構造体１１０３のインスタンスを、Ｒｕｂｙインタプリタ１２２にＲｕｂｙクラスのコンストラクタの戻り値として渡す。
ａｎｄｒｏｉｄ／ｗｉｄｇｅｔ／ＴｅｘｔＶｉｅｗクラスを変換したＲｕｂｙクラスのコンストラクタの場合では、ａｎｄｒｏｉｄ／ｗｉｄｇｅｔ／ＴｅｘｔＶｉｅｗクラスのｊｏｂｊｅｃｔ１２１３にｊｃｌａｓｓ１２１４経由でアクセス可能なＲＤａｔａ構造体１１０３のインスタンスをＲｕｂｙインスタンスとしてＲｕｂｙインタプリタ１２２に渡す。
【００６２】
図２０は、クラス名Ａに属するメソッド名ａのＪａｖａメソッドのＲｕｂｙメソッドへの変換処理を説明したフローチャートである。
ステップＳ２００１では、メソッド登録関数１１２２が、キャスト済みメソッドテーブル１２４０からメソッド名ａを検索する。キャスト済みメソッドテーブル１２４０にメソッド名ａが存在する場合は、処理を終了し、存在しない場合は、ステップＳ２００２に進む。
ステップＳ２００２では、メソッド登録関数１１２２が、クラス名ＡとしてステップＳ１７１４もしくはステップＳ１７１５でＲｕｂｙインタプリタ１２２に登録したＲＤａｔａ構造体１１０３のインスタンスから、クラスＩＤ１２１６を取得する。
ａｎｄｒｏｉｄ／ｗｉｄｇｅｔ／ＴｅｘｔＶｉｅｗクラスのｓｅｔＴｅｘｔメソッドを変換する場合では、ＲＤａｔａ構造体１１０３のクラスＩＤ１２１６から２が抽出される。
ステップＳ２００３では、メソッド登録関数１１２２が、ステップＳ２００２で抽出したクラスＩＤ１２１６とメソッド名ａをメソッドテーブル１１２から検索し、シグネチャ、引数型ＩＤ、戻り値型ＩＤを抽出する。
ｓｅｔＴｅｘｔメソッドの場合、メソッドシグネチャ（[ＣＩＩ）Ｖ、引数型ＩＤ３／５／５、戻り値型ＩＤ０が抽出される。
【００６３】
ステップＳ２００４では、メソッド登録関数１１２２が、メソッド名ａとステップＳ２００３で抽出したシグネチャを引数に、Ｊａｖａメソッド取得関数１１１２を呼び出し、ｊｍｅｔｈｏｄＩＤを取得する。
ステップＳ２００５では、メソッド登録関数１１２２が、ｒｍｅｔｈｏｄ構造体１２３０のメモリ領域を確保し、インスタンスを生成し、ステップＳ１９０４で取得したｊｍｅｔｈｏｄＩＤを格納する。
【００６４】
ステップＳ２００６では、メソッド登録関数１１２２が、ステップＳ２００３で抽出した引数型ＩＤを引数キャスト関数テーブル１１２６から検索し、キャスト関数ポインタを抽出し、ｍａｒｇｃａｓｔ関数配列に格納する。
メソッド名ａのメソッドに引数が複数存在する時は、スラッシュで区切られた複数の引数型ＩＤ、それぞれを引数キャスト関数テーブル１１２６から検索し、抽出されたキャスト関数ポインタをｍａｒｇｃａｓｔ関数配列に格納する。引数型ＩＤが０の場合、引数の変換は不要なため、ｍａｒｇｃａｓｔ関数配列には何も格納されない。
ｓｅｔＴｅｘｔメソッドの場合、引数型ＩＤは３，５，５であり、引数キャスト関数テーブル１１２６から＊ｒ２ｊｃｈａｒａｒｒａｙ、＊ｒ２ｊｉｎｔ、＊ｒ２ｊｉｎｔが抽出され、ｍａｒｇｃａｓｔ関数配列１２３２に格納される。
【００６５】
ステップＳ２００７では、メソッド登録関数１１２２が、ステップＳ２００３で抽出した戻り値型ＩＤを戻り値キャスト関数テーブル１１２７から検索し、キャスト関数ポインタを抽出し、＊ｒｅｔｕｒｎｃａｓｔ関数１２３３に格納する。
戻り値型ＩＤが０の場合、戻り値の変換は不要なため、＊ｒｅｔｕｒｎｃａｓｔ関数１２３３には何も格納されない。ｓｅｔＴｅｘｔメソッドの場合、戻り値型ＩＤは０であり、＊ｒｅｔｕｒｎｃａｓｔ関数１２３３には何も格納されない。
【００６６】
ステップＳ２００８では、メソッド登録関数１１２２が、ステップＳ２００５で生成したｒｍｅｔｈｏｄ構造体１２３０のインスタンスのポインタを、クラス名ＡとしてステップＳ１７１４もしくはステップＳ１７１５でＲｕｂｙインタプリタ１２２に登録したＲＤａｔａ構造体１１０３のメンバのｒｃｌａｓｓ構造体１２１０のメンバのｒｍｅｔｈｏｄ配列に格納する。
【００６７】
ステップＳ２００９では、メソッド登録関数１１２２が、キャスト済みメソッドテーブル１２４０に、ステップＳ２００８で、ｒｍｅｔｈｏｄ構造体１２３０のポインタを格納したｒｍｅｔｈｏｄ配列の位置をメソッド番号として、メソッド名とともに格納する。
図１３のキャスト済みメソッドテーブル１２４０にｓｅｔＴｅｘｔメソッドを格納する場合では、既にｇｅｔＴｅｘｔメソッドがＲｕｂｙメソッドとして登録されており、ｒｍｅｔｈｏｄ配列には０番目の位置にｇｅｔＴｅｘｔメソッドを表すｒｍｅｔｈｏｄ構造体１２３０が格納されている。この場合、ステップＳ２００８では、ｒｍｅｔｈｏｄ配列の１番目にｒｍｅｔｈｏｄ構造体１２３０が格納されており、キャスト済みメソッドテーブル１２４０には、メソッド番号１とメソッド名ｓｅｔＴｅｘｔが格納される。
【００６８】
図２１は、Ｒｕｂｙアプリケーション１２１が、Ｊａｖａメソッドから変換されたＲｕｂｙメソッドを呼び出す処理のフローチャートである。
ステップＳ２１０１では、Ｒｕｂｙインタプリタ１２２上で実行されているＲｕｂｙアプリケーション１２１が、ステップＳ１７１４もしくはステップＳ１７１５で登録されたＲｕｂｙクラスＡのメソッドａを呼び出す。
【００６９】
ステップＳ２１０２では、Ｒｕｂｙインタプリタ１２２が、メソッドａのメソッド名、メソッドａの引数、ＲｕｂｙクラスＡとして登録されたＲＤａｔａ構造体１１０３のインスタンスを渡して、ＲｕｂｙクラスＡのｍｅｔｈｏｄ＿ｍｉｓｓｉｎｇメソッドとして登録されているｊｍｅｔｈｏｄ＿ｍｉｓｓｉｎｇ関数１１２４を呼び出す。
【００７０】
ステップＳ２１０３では、ｊｍｅｔｈｏｄ＿ｍｉｓｓｉｎｇ関数１１２４が、ステップＳ２１０２で受け取ったメソッド名をキャスト済みメソッドテーブル１２４０から検索し、メソッド番号を抽出する。クラス名がａｎｄｒｏｉｄ／ｗｉｄｇｅｔ／ＴｅｘｔＶｉｅｗで、メソッド名がｓｅｔＴｅｘｔだった場合、ステップＳ１７０８で格納されたメソッド番号１が抽出される。
【００７１】
ステップＳ２１０４では、ｊｍｅｔｈｏｄ＿ｍｉｓｓｉｎｇ関数１１２４が、ステップＳ２１０２で渡されたＲｕｂｙクラスＡのＲＤａｔａ構造体１１０３メンバのｒｃｌａｓｓ構造体１２１０メンバのｒｍｅｔｈｏｄ配列の、ステップＳ２１０３で抽出したメソッド番号と同じ位置にあるｒｍｅｔｈｏｄ構造体１２３０を取得し、ｒｍｅｔｈｏｄ構造体１２３０メンバのｍａｒｇｃａｓｔ関数配列内のキャスト関数に、ステップＳ２１０２で渡された引数を渡して呼び出し、戻り値をｒｍｅｔｈｏｄ構造体１２３０メンバのｍａｒｇｓ配列に格納する。
ｓｅｔＴｅｘｔメソッドの呼び出しの場合、引数として受け取ったＲｕｂｙインタプリタ１２２上でのｃｈａｒ配列と２つのｉｎｔ値をそれぞれｒ２ｊｃｈａｒａｒｒａｙ関数とｒ２ｊｉｎｔ関数に渡して、ＤａｌｖｉｋＶＭ１２５上で処理することができるｃｈａｒ配列と２つのｉｎｔ値に変換して、ｍａｒｇｓ配列に格納する。
【００７２】
ステップＳ２１０５では、ｊｍｅｔｈｏｄ＿ｍｉｓｓｉｎｇ関数１１２４が、ステップＳ２１０４で取得したｒｍｅｔｈｏｄ構造体１２３０メンバのｍａｒｇｓ配列内の値を渡して、ステップＳ２１０４で取得したｒｍｅｔｈｏｄ構造体１２３０メンバのｊｍｅｔｈｏｄＩＤ１２３４をＪａｖａメソッド取得関数１１１２に渡して、Ｊａｖａメソッドを呼び出す。
ステップＳ２１０１で呼び出されたメソッドが、ｓｅｔＴｅｘｔメソッドであれば、ＪａｖａのｓｅｔＴｅｘｔが、ＤａｌｖｉｋＶＭ１２５上で扱える型に変換されたｃｈａｒ配列と２つのｉｎｔ値を引数として、呼び出される。
【００７３】
ステップＳ２１０６では、ｊｍｅｔｈｏｄ＿ｍｉｓｓｉｎｇ関数１１２４が、ステップＳ２１０５で呼び出されたＪａｖａメソッドの戻り値を、ステップＳ２１０４で取得したｒｍｅｔｈｏｄ構造体１２３０メンバのｒｅｔｕｒｎｃａｓｔ関数に渡して、呼び出す。
ステップＳ２１０１で呼び出されたメソッドが、ｓｅｔＴｅｘｔメソッドであれば、戻り値はｖｏｉｄ型であり、＊ｒｅｔｕｒｎｃａｓｔ関数１２３３には、何も格納されておらず、ｒｅｔｕｒｎｃａｓｔ関数は呼び出されない。
【００７４】
ステップＳ２１０７では、ｊｍｅｔｈｏｄ＿ｍｉｓｓｉｎｇ関数１１２４が、ステップＳ２１０６で呼び出したｒｅｔｕｒｎｃａｓｔ関数の戻り値を、Ｒｕｂｙメソッドａの戻り値としてＲｕｂｙインタプリタ１２２上で動作するＲｕｂｙアプリケーション１２１に返す。
【符号の説明】
【００７５】
１００               テーブル生成端末
１０１               テーブル生成プログラム
１０２               ＪａｖａＡｒｃｈｉｖｅファイル
１０３               ＪａｖａＶＭ
１０４               Ｊａｖａクラスローダー
１０５               ＯＳ
１１０               ＪａｖａＡＰＩテーブル
１１１               クラステーブル
１１２               メソッドテーブル
１１３               型テーブル
１２０               Ｒｕｂｙ実行端末
１２１               Ｒｕｂｙアプリケーション
１２２               Ｒｕｂｙインタプリタ
１２３               キャストプログラム
１２４               ＪａｖａＡｒｃｈｉｖｅファイル
１２５               ＤａｌｖｉｋＶＭ
１２６               ＡｎｄｒｏｉｄＯＳ
１１００             Ｒｕｂｙ拡張ライブラリ
１１０１             クラス追加関数
１１０２             メソッド追加関数
１１０３             ＲＤａｔａ構造体
１１１０             ＪＮＩライブラリ
１１１１             Ｊａｖａクラス取得関数
１１１２             Ｊａｖａメソッド取得関数
１１１３             Ｊａｖａメソッド呼出関数
１１２１             クラス登録関数
１１２２             メソッド登録関数
１１２３             キャストコンストラクタ関数
１１２４             ｊｍｅｔｈｏｄ＿ｍｉｓｓｉｎｇ関数
１１２５             キャスト済みクラステーブル
１１２６             引数キャスト関数テーブル
１１２７             戻り値キャスト関数テーブル
１２０１             ＊ｒｃｌａｓｓ
１２１０             ｒｃｌａｓｓ構造体
１２１１             ＊ｒｃｏｎｓｔｒｕｃｔｏｒ
１２１２             ＊ｒｍｅｔｈｏｄ配列
１２１３             ｊｏｂｊｅｃｔ
１２１４             ｊｃｌａｓｓ
１２１５             ＊キャスト済みメソッドテーブル
１２１６             クラスＩＤ
１２２０             ｒｃｏｎｓｔｒｕｃｔｏｒ構造体
１２２１             ＊ａｒｇｓ配列
１２２２             ＊ａｒｇｃａｓｔ関数配列
１２２３             ｊｍｅｔｈｏｄＩＤ
１２３０             ｒｍｅｔｈｏｄ構造体
１２３１             ＊ａｒｇｓ配列
１２３２             ＊ａｒｇｃａｓｔ関数配列
１２３３             ＊ｒｅｔｕｒｎｃａｓｔ関数
１２３４             ｊｍｅｔｈｏｄＩＤ
１２４０             キャスト済みメソッドテーブル
【図１】
0005427802.tif 000002
【図２】
0005427802.tif 000003
【図３】
0005427802.tif 000004
【図４】
0005427802.tif 000005
【図５】
0005427802.tif 000006
【図６】
0005427802.tif 000007
【図７】
0005427802.tif 000008
【図８】
0005427802.tif 000009
【図９】
0005427802.tif 000010
【図１０】
0005427802.tif 000011
【図１１】
0005427802.tif 000012
【図１２】
0005427802.tif 000013
【図１３】
0005427802.tif 000014
【図１４】
0005427802.tif 000015
【図１５】
0005427802.tif 000016
【図１６】
0005427802.tif 000017
【図１７】
0005427802.tif 000018
【図１８】
0005427802.tif 000019
【図１９】
0005427802.tif 000020
【図２０】
0005427802.tif 000021
【図２１】
0005427802.tif 000022