"OS、JavaVM、テーブル生成プログラム、JavaArchiveファイルを搭載するテーブル生成端末と、Java以外の言語で開発されたアプリケーションを実行する他プログラミング言語実行環境と、キャストプログラム、JavaVM、JavaArchiveファイルを搭載するアプリケーション実行端末から成るライブラリ変換環境におけるライブラリ変換方法であって、前記テーブル生成プログラムが、前記JavaArchiveファイルを解析し、Javaクラス名をクラステーブルに格納するステップと、Javaメソッド名と引数の型と戻り値の型を格納するメソッドテーブルを生成するステップとを備え、前記キャストプログラムがクラス登録関数及びメソッド登録関数を備え、前記クラス登録関数が前記クラステーブルからJavaクラス名を抽出し、同名のクラスを前記他プログラミング言語実行環境に定義するステップと、前記メソッド登録関数が前記メソッドテーブルからJavaメソッド名と引数の型と戻り値の型を抽出し、同名のJavaメソッドを呼び出す関数を前記他プログラミング言語実行環境に定義するステップとを備えることを特徴とするプログラミング言語間でのライブラリ変換方法。前記テーブル生成プログラムが、前記クラステーブルにJavaスーパークラスを特定する情報を格納するステップをさらに備え、前記キャストプログラムが、前記クラステーブルからJavaスーパークラスを特定する情報を抽出し、Javaのクラス階層を前記他プログラミング言語実行環境上に反映するステップをさらに備えることを特徴とする請求項1に記載のプログラミング言語間でのライブラリ変換方法。前記キャストプログラムがキャスト関数を備え、このキャスト関数により前記メソッドテーブルからJavaメソッドの引数と戻り値の型を抽出し、引数と戻り値を、前記他プログラミング言語実行環境上でのデータフォーマットと前記JavaVM上でのデータフォーマットに相互に変換するステップとをさらに備え、Javaメソッドを呼び出す前後に前記キャスト関数を呼び出すステップをさらに備えることを特徴とする請求項2に記載のプログラミング言語間でのライブラリ変換方法。OS、JavaVM、テーブル生成プログラム、JavaArchiveファイルを搭載するテーブル生成端末と、Java以外の言語で開発されたアプリケーションを実行する他プログラミング言語実行環境と、キャストプログラム、JavaVM、JavaArchiveファイルを搭載するアプリケーション実行端末から成るライブラリ変換環境において実行されるプログラムであって、前記テーブル生成プログラムが、前記JavaArchiveファイルを解析し、Javaクラス名をクラステーブルに格納するステップと、Javaメソッド名と引数の型と戻り値の型を格納するメソッドテーブルを生成するステップとを備え、前記キャストプログラムがクラス登録関数及びメソッド登録関数を備え、前記クラス登録関数が前記クラステーブルからJavaクラス名を抽出し、同名のクラスを前記他プログラミング言語実行環境に定義するステップと、前記メソッド登録関数が前記メソッドテーブルからJavaメソッド名と引数の型と戻り値の型を抽出し、同名のJavaメソッドを呼び出す関数を前記他プログラミング言語実行環境に定義するステップとを備えることを特徴とするプログラミング言語間でのライブラリ変換プログラム。前記テーブル生成プログラムが、前記クラステーブルにJavaスーパークラスを特定する情報を格納するステップをさらに備え、前記キャストプログラムが、前記クラステーブルからJavaスーパークラスを特定する情報を抽出し、Javaのクラス階層を前記他プログラミング言語実行環境上に反映するステップをさらに備えることを特徴とする請求項4に記載のプログラミング言語間でのライブラリ変換プログラム。前記キャストプログラムがキャスト関数を備え、このキャスト関数により前記メソッドテーブルからJavaメソッドの引数と戻り値の型を抽出し、引数と戻り値を、前記他プログラミング言語実行環境上でのデータフォーマットと前記JavaVM上でのデータフォーマットに相互に変換するステップとをさらに備え、Javaメソッドを呼び出す前後に前記キャスト関数を呼び出すステップをさらに備えることを特徴とする請求項5に記載のプログラミング言語間でのライブラリ変換プログラム。しかしながら、上記Rjbのような方法では、プログラム実行中に、Rubyメソッドの引数や戻り値の型を解析する処理が必要になるため、RubyアプリケーションからJavaメソッドを実行する時間は、Javaアプリケーション上でのJavaメソッド実行時間よりも大きくなってしまう。本発明の目的は、JNIを利用して、他言語アプリケーションからJavaメソッドを実行するために必要な時間を削減することが可能なライブラリ変換方法及びプログラムを提供することである。前記の目的を達成するため、本発明に係るプログラミング言語間でのライブラリ変換方法は、Javaクラス名、Javaメソッド名、引数と戻り値の型を格納したテーブルを予め用意しておき、テーブルから取得したJavaクラス名、Javaメソッド名、引数と戻り値の型から、他言語アプリケーションの実行環境上に、Javaメソッドを呼び出すためのメソッドを生成するように構成したものである。具体的には、本発明に係るプログラミング言語間でのライブラリ変換方法は、OSオペレーティングシステム、JavaVM、テーブル生成プログラム、JavaArchiveファイルを搭載するテーブル生成端末と、Java以外の言語で開発されたアプリケーションを実行する他プログラミング言語実行環境と、キャストプログラム、JavaVM、JavaArchiveファイルを搭載するアプリケーション実行端末から成るライブラリ変換環境におけるライブラリ変換方法であって、前記テーブル生成プログラムが、前記JavaArchiveファイルを解析し、Javaクラス名をクラステーブルに格納するステップと、Javaメソッド名と引数の型と戻り値の型を格納するメソッドテーブルを生成するステップとを備え、前記キャストプログラムがクラス登録関数及びメソッド登録関数を備え、前記クラス登録関数が前記クラステーブルからJavaクラス名を抽出し、同名のクラスを前記他プログラミング言語実行環境に定義するステップと、前記メソッド登録関数が前記メソッドテーブルからJavaメソッド名と引数の型と戻り値の型を抽出し、同名のJavaメソッドを呼び出す関数を前記他プログラミング言語実行環境に定義するステップとを備えることを特徴とする。また、前記テーブル生成プログラムが、前記クラステーブルにJavaスーパークラスを特定する情報を格納するステップをさらに備え、前記キャストプログラムが、前記クラステーブルからJavaスーパークラスを特定する情報を抽出し、Javaのクラス階層を前記他プログラミング言語実行環境上に反映するステップをさらに備えることを特徴とする。また、前記キャストプログラムがキャスト関数を備え、このキャスト関数により前記メソッドテーブルからJavaメソッドの引数と戻り値の型を抽出し、引数と戻り値を、前記他プログラミング言語実行環境上でのデータフォーマットと前記JavaVM上でのデータフォーマットに相互に変換するステップとをさらに備え、Javaメソッドを呼び出す前後に前記キャスト関数を呼び出すステップをさらに備えることを特徴とする。また、本発明に係るプログラミング言語間でのライブラリ変換プログラムは、OSオペレーティングシステム、JavaVM、テーブル生成プログラム、JavaArchiveファイルを搭載するテーブル生成端末と、Java以外の言語で開発されたアプリケーションを実行する他プログラミング言語実行環境と、キャストプログラム、JavaVM、JavaArchiveファイルを搭載するアプリケーション実行端末から成るライブラリ変換環境において実行されるプログラムであって、前記テーブル生成プログラムが、前記JavaArchiveファイルを解析し、Javaクラス名をクラステーブルに格納するステップと、Javaメソッド名と引数の型と戻り値の型を格納するメソッドテーブルを生成するステップとを備え、前記キャストプログラムがクラス登録関数及びメソッド登録関数を備え、前記クラス登録関数が前記クラステーブルからJavaクラス名を抽出し、同名のクラスを前記他プログラミング言語実行環境に定義するステップと、前記メソッド登録関数が前記メソッドテーブルからJavaメソッド名と引数の型と戻り値の型を抽出し、同名のJavaメソッドを呼び出す関数を前記他プログラミング言語実行環境に定義するステップとを備えることを特徴とする。また、前記テーブル生成プログラムが、前記クラステーブルにJavaスーパークラスを特定する情報を格納するステップをさらに備え、前記キャストプログラムが、前記クラステーブルからJavaスーパークラスを特定する情報を抽出し、Javaのクラス階層を前記他プログラミング言語実行環境上に反映するステップをさらに備えることを特徴とする。また、前記キャストプログラムがキャスト関数を備え、このキャスト関数により前記メソッドテーブルからJavaメソッドの引数と戻り値の型を抽出し、引数と戻り値を、前記他プログラミング言語実行環境上でのデータフォーマットと前記JavaVM上でのデータフォーマットに相互に変換するステップとをさらに備え、Javaメソッドを呼び出す前後に前記キャスト関数を呼び出すステップをさらに備えることを特徴とする。本発明によれば、JNIを利用して、他言語アプリケーションから、Javaメソッドを実行するために必要な時間を削減することができる。以下、図面を参照して本発明の実施形態について説明する。図1は、本発明のプログラミング言語間でのライブラリ変換方法及びプログラムを実現するためのシステムの機能ブロック図である。図1のシステムは、テーブル生成端末100、Ruby実行端末120、JavaAPIテーブル110からなる。テーブル生成端末100はJavaAPIテーブル110を生成する端末であり、OS105、JavaVM103、テーブル生成プログラム101、JavaArchiveファイル102から成る。JavaArchiveファイル102は、コンパイルされた複数のJavaクラスファイルを一つにまとめ、圧縮したファイルである。JavaVM103は、Java言語で開発されたプログラムを実行するプログラムであり、Javaクラスローダー104が搭載されている。Javaクラスローダー104は、Javaクラスファイルを読み込み、JavaVM103上で動作するプログラムが、Javaクラスのメソッドを利用するための機能である。Ruby実行端末120は、Ruby言語で開発されたRubyアプリケーション121を実行する端末であり、AndroidOS126、DalvikVM125103、JavaArchiveファイル124、Rubyインタプリタ122、キャストプログラム123、Rubyアプリケーション121から成る。キャストプログラム123は、JavaAPIテーブル110内の情報を読み取り、JavaクラスメソッドをRubyクラスメソッドに変換する処理を行うプログラムである。なお、Rubyアプリケーション121は、JavaAPIの機能を利用する処理を含む。JavaAPIテーブル110は、クラステーブル111とメソッドテーブル112、型テーブル113から成る。クラステーブル111の構成を図2に示す。クラステーブル111は、1レコードに1つのJavaクラスの情報が格納されるテーブルで、クラスID、クラス名、スーパークラスIDから成る。クラスIDは、Javaクラスに一意に割り振られる値である。クラス名は、Javaパッケージ名を含む完全修飾クラス名である。スーパークラスIDは、スーパークラスのクラスIDである。図2の場合では、android/widget/TextViewクラスのスーパークラスは、android/view/Viewクラスであるため、android/widget/TextViewクラスのスーパークラスIDは1となる。また、Java/lang/Objectクラスには、スーパークラスが存在しないため、スーパークラスIDには何も入らず、nullと表記している。メソッドテーブル112の構成を図3に示す。メソッドテーブル112は、1レコードに1つのJavaメソッドの情報が格納されるテーブルで、クラスID、メソッドID、メソッド名、シグネチャ、引数型ID、戻り値型IDからなる。メソッドIDは、Javaメソッドに一意に割り振られる値である。メソッド名は、Javaメソッドの名前であり、コンストラクタはで表す。メソッドシグネチャは、メソッドを識別するために用いられる引数と戻り値の型のリストであり、jmethodIDを得るために必要である。図3のsetTextメソッドの場合では、1つのchar配列型と2つのint型の引数を持ち、戻り値はvoidであるため、;Vと引数型ID9を抽出する。ステップS1708では、クラス登録関数1121が、メソッド名<init>とメソッドシグネチャを引数に、Javaメソッド取得関数1112を呼び出し、jmethodIDを取得する。ステップS1709では、クラス登録関数1121が、rconstructor構造体1220のメモリ領域を確保し、rconstructor構造体1220のインスタンスを生成し、jmethodIDを格納する。ステップS1710では、クラス登録関数1121が、ステップS1707で抽出した引数型IDを引数キャスト関数テーブル1126から検索し、キャスト関数ポインタを抽出する。引数が複数ある場合、キャスト関数ポインタも複数抽出される。android/widget/TextViewクラスの場合、引数型IDは9であるため、j2robjectが抽出される。ステップS1711では、クラス登録関数1121が、ステップS1709で生成したRrconstructor構造体1220のインスタンスのcargcast関数配列に、ステップS1710で抽出したキャスト関数ポインタを格納する。ステップS1712では、クラス登録関数1121が、RData構造体1103のメモリ領域を確保し、RData構造体1103のインスタンスを生成し、ステップS1705で生成したrclass構造体1210のインスタンスのポインタを格納する。ステップS1713では、ステップS1702でスーパークラスIDが抽出された場合、ステップS1714に進み、存在しなかった場合、ステップS1715に進む。ステップS1714では、クラス登録関数1121が、ステップS1704で抽出されたクラス名SAを持つRubyクラスのサブクラスとして、ステップS1712で生成されたRData構造体1103のインスタンスをクラス名AのRubyクラスに登録する。ステップS1715では、クラス登録関数1121が、RubyのObjectクラスのサブクラスとして、ステップS1712で生成されたRData構造体1103のインスタンスをクラス名AのRubyクラスに登録する。RubyのObjectクラスは、Rubyのクラス階層のルートに存在するクラスであり、Objectクラスにスーパークラスは存在しない。ステップS1716では、クラス登録関数1121が、キャスト済みクラステーブル1125にクラス名Aを格納する。ステップS1717では、クラス登録関数1121が、メソッド追加関数1102を呼び出し、クラス名AのRubyクラスのコンストラクタに、キャストコンストラクタ関数1123のポインタを登録する。ステップS1718では、クラス登録関数1121が、メソッド追加関数1102を呼び出し、クラス名AのRubyクラスのmethod_missingメソッドにjmethod_missing関数1124のポインタを登録する。図19は、JavaクラスのRubyクラスへの変換処理により登録されたRubyクラスのオブジェクト生成処理のフローチャートである。本フローチャートは、Rubyアプリケーション121実行時に、JavaクラスのRubyクラスへの変換処理により登録されたRubyクラスのコンストラクタが呼び出された時に開始される。ステップS1901では、キャストコンストラクタ関数1123が、Rubyインタプリタ122からRubyコンストラクタの引数と、Rubyコンストラクタの呼出元のRubyクラスとして登録されているRData構造体1103のインスタンスを取得する。Javaのandroid/widget/TextViewクラスを変換したRubyクラスのコンストラクタの場合では、Rubyインタプリタ122上では、Javaのandroid/content/Contextクラスを変換したRubyクラスのオブジェクトを引数として受け取り、呼び出される。ステップS1902では、キャストコンストラクタ関数1123が、ステップS1901で取得した引数を渡して、ステップS1901で取得したRData構造体1103のインスタンスからjconstructor構造体1220のcargcast関数配列を取得し、ステップS1711でcargcast関数配列に格納されたポインタが示すキャスト関数を呼び出し、戻り値であるjobject1213をステップS1901で取得したRData構造体1103のインスタンスからjconstructor構造体1220のargs配列1221に格納する。引数が複数ある場合、cargcast関数配列1222にもキャスト配列のポインタが複数格納されており、それぞれの引数を対応したキャスト関数に渡して呼び出し、戻り値を全てcargs配列1221に格納する。android/widget/TextViewクラスを変換したRubyクラスのコンストラクタの場合では、r2jobjectが呼び出され、android/content/Contextクラスを変換したRubyクラスのオブジェクトからJavaオブジェクトのポインタを取得し、cargs配列1221に格納する。ステップS1903では、キャストコンストラクタ関数1123が、ステップS1902でargs配列に格納された戻り値を引数として渡し、ステップS1901で取得したRDataからjconstructor構造体1220のjmethodID1223の示すJavaコンストラクタを呼び出し、戻り値としてjobjectを取得する。ステップS1903では、キャストコンストラクタ関数1123が、ステップS1901で取得したRData構造体1103のメンバであるrclass構造体1210に、ステップS1903で取得したjobject1213を格納する。ステップS1904では、キャストコンストラクタ関数1123が、ステップS1901で取得したRData構造体1103のインスタンスを、Rubyインタプリタ122にRubyクラスのコンストラクタの戻り値として渡す。android/widget/TextViewクラスを変換したRubyクラスのコンストラクタの場合では、android/widget/TextViewクラスのjobject1213にjclass1214経由でアクセス可能なRData構造体1103のインスタンスをRubyインスタンスとしてRubyインタプリタ122に渡す。図20は、クラス名Aに属するメソッド名aのJavaメソッドのRubyメソッドへの変換処理を説明したフローチャートである。ステップS2001では、メソッド登録関数1122が、キャスト済みメソッドテーブル1240からメソッド名aを検索する。キャスト済みメソッドテーブル1240にメソッド名aが存在する場合は、処理を終了し、存在しない場合は、ステップS2002に進む。ステップS2002では、メソッド登録関数1122が、クラス名AとしてステップS1714もしくはステップS1715でRubyインタプリタ122に登録したRData構造体1103のインスタンスから、クラスID1216を取得する。android/widget/TextViewクラスのsetTextメソッドを変換する場合では、RData構造体1103のクラスID1216から2が抽出される。ステップS2003では、メソッド登録関数1122が、ステップS2002で抽出したクラスID1216とメソッド名aをメソッドテーブル112から検索し、シグネチャ、引数型ID、戻り値型IDを抽出する。setTextメソッドの場合、メソッドシグネチャCIIV、引数型ID3/5/5、戻り値型ID0が抽出される。ステップS2004では、メソッド登録関数1122が、メソッド名aとステップS2003で抽出したシグネチャを引数に、Javaメソッド取得関数1112を呼び出し、jmethodIDを取得する。ステップS2005では、メソッド登録関数1122が、rmethod構造体1230のメモリ領域を確保し、インスタンスを生成し、ステップS1904で取得したjmethodIDを格納する。ステップS2006では、メソッド登録関数1122が、ステップS2003で抽出した引数型IDを引数キャスト関数テーブル1126から検索し、キャスト関数ポインタを抽出し、margcast関数配列に格納する。メソッド名aのメソッドに引数が複数存在する時は、スラッシュで区切られた複数の引数型ID、それぞれを引数キャスト関数テーブル1126から検索し、抽出されたキャスト関数ポインタをmargcast関数配列に格納する。引数型IDが0の場合、引数の変換は不要なため、margcast関数配列には何も格納されない。setTextメソッドの場合、引数型IDは3,5,5であり、引数キャスト関数テーブル1126からr2jchararray、r2jint、r2jintが抽出され、margcast関数配列1232に格納される。ステップS2007では、メソッド登録関数1122が、ステップS2003で抽出した戻り値型IDを戻り値キャスト関数テーブル1127から検索し、キャスト関数ポインタを抽出し、returncast関数1233に格納する。戻り値型IDが0の場合、戻り値の変換は不要なため、returncast関数1233には何も格納されない。setTextメソッドの場合、戻り値型IDは0であり、returncast関数1233には何も格納されない。ステップS2008では、メソッド登録関数1122が、ステップS2005で生成したrmethod構造体1230のインスタンスのポインタを、クラス名AとしてステップS1714もしくはステップS1715でRubyインタプリタ122に登録したRData構造体1103のメンバのrclass構造体1210のメンバのrmethod配列に格納する。ステップS2009では、メソッド登録関数1122が、キャスト済みメソッドテーブル1240に、ステップS2008で、rmethod構造体1230のポインタを格納したrmethod配列の位置をメソッド番号として、メソッド名とともに格納する。図13のキャスト済みメソッドテーブル1240にsetTextメソッドを格納する場合では、既にgetTextメソッドがRubyメソッドとして登録されており、rmethod配列には0番目の位置にgetTextメソッドを表すrmethod構造体1230が格納されている。この場合、ステップS2008では、rmethod配列の1番目にrmethod構造体1230が格納されており、キャスト済みメソッドテーブル1240には、メソッド番号1とメソッド名setTextが格納される。図21は、Rubyアプリケーション121が、Javaメソッドから変換されたRubyメソッドを呼び出す処理のフローチャートである。ステップS2101では、Rubyインタプリタ122上で実行されているRubyアプリケーション121が、ステップS1714もしくはステップS1715で登録されたRubyクラスAのメソッドaを呼び出す。ステップS2102では、Rubyインタプリタ122が、メソッドaのメソッド名、メソッドaの引数、RubyクラスAとして登録されたRData構造体1103のインスタンスを渡して、RubyクラスAのmethod_missingメソッドとして登録されているjmethod_missing関数1124を呼び出す。ステップS2103では、jmethod_missing関数1124が、ステップS2102で受け取ったメソッド名をキャスト済みメソッドテーブル1240から検索し、メソッド番号を抽出する。クラス名がandroid/widget/TextViewで、メソッド名がsetTextだった場合、ステップS1708で格納されたメソッド番号1が抽出される。ステップS2104では、jmethod_missing関数1124が、ステップS2102で渡されたRubyクラスAのRData構造体1103メンバのrclass構造体1210メンバのrmethod配列の、ステップS2103で抽出したメソッド番号と同じ位置にあるrmethod構造体1230を取得し、rmethod構造体1230メンバのmargcast関数配列内のキャスト関数に、ステップS2102で渡された引数を渡して呼び出し、戻り値をrmethod構造体1230メンバのmargs配列に格納する。setTextメソッドの呼び出しの場合、引数として受け取ったRubyインタプリタ122上でのchar配列と2つのint値をそれぞれr2jchararray関数とr2jint関数に渡して、DalvikVM125上で処理することができるchar配列と2つのint値に変換して、margs配列に格納する。ステップS2105では、jmethod_missing関数1124が、ステップS2104で取得したrmethod構造体1230メンバのmargs配列内の値を渡して、ステップS2104で取得したrmethod構造体1230メンバのjmethodID1234をJavaメソッド取得関数1112に渡して、Javaメソッドを呼び出す。ステップS2101で呼び出されたメソッドが、setTextメソッドであれば、JavaのsetTextが、DalvikVM125上で扱える型に変換されたchar配列と2つのint値を引数として、呼び出される。ステップS2106では、jmethod_missing関数1124が、ステップS2105で呼び出されたJavaメソッドの戻り値を、ステップS2104で取得したrmethod構造体1230メンバのreturncast関数に渡して、呼び出す。ステップS2101で呼び出されたメソッドが、setTextメソッドであれば、戻り値はvoid型であり、returncast関数1233には、何も格納されておらず、returncast関数は呼び出されない。ステップS2107では、jmethod_missing関数1124が、ステップS2106で呼び出したreturncast関数の戻り値を、Rubyメソッドaの戻り値としてRubyインタプリタ122上で動作するRubyアプリケーション121に返す。"