説明

プログラミング言語間でのライブラリ変換方法及びプログラム

【課題】 JavaNativeインターフェースを利用して、他プログラミング言語で開発されたアプリケーションから、Javaメソッドを実行するために必要な時間を削減する。
【解決手段】 JavaArchiveファイルからJavaクラス名、Javaメソッド名、引数と戻り値の型を格納するテーブルを生成するテーブル生成手段を搭載した端末と、Java以外の言語で開発されたアプリケーションを実行する他プログラミング言語実行環境上にJavaメソッドを呼び出す処理とJavaVMと他プログラミング言語実行環境間でのデータフォーマットを変換する処理を含む関数を、他言語のメソッドとして定義するメソッド登録手段を搭載した端末から構成する。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、Ruby等の他の言語で記述されたアプリケーションからJava(サンマイクロシステムズ社の登録商標)ライブラリを利用するための、プログラミング言語間でのライブラリ変換方法及びプログラムに関するものである。
【背景技術】
【0002】
近年、モバイル用のオープンソースオペレーティングシステムとしてAndroid(グーグル社の登録商標)が登場し、様々なハードウェアに搭載されている。Android用のアプリケーションは、Android用のJavaVM(Java Vertual Machine)であるDalvikVM(Dalvik Vertual Machine)上で動作し、開発に用いる標準的なプログラミング言語はJava(登録商標)である。ただし、他のプログラミング言語であっても実行環境をAndroidに移植すれば、Java以外の言語でもAndroid上で動作するアプリケーションを開発することは可能になる。
ただし、AndroidはWindows(マイクロソフトコーポレーションの登録商標)やLinux等の既存のOS105と異なり、加速度センサやGPS等、携帯端末向けの機能を有しており、全てJavaのライブラリとして提供されているため、他のOS上で動作する実行環境をAndroidに移植しただけでは、他の言語からはそれらの機能を利用することができない。
【0003】
他の言語からJavaのライブラリを利用するための方法としては、他の言語のソースコードをJavaのソースコードに変換する方法と、他の言語で開発されたプログラムからJavaのライブラリにアクセスする方法が考えられる。COBOLのソースコードをJavaのソースコードに変換する方法が、下記の特許文献1に記載されている。ただし、他の言語からJavaのライブラリを利用する方法として、ソースコードの変換を行った場合、アプリケーションを動作させるためには、他の言語でソースコードを記述し、Javaのソースコードに変換し、変換されたソースコードをコンパイルするという過程が必要になるため、アプリケーションの開発効率を大きく減じることになる。
他の言語で開発されたプログラムからJavaのライブラリにアクセスする方法は、JavaVMが備える、JavaアプリケーションとNative言語で開発されたアプリケーション間で、相互にライブラリを利用するための手段である、JNI(Java Native Interface)を利用することで実現できる。
JNIは、Javaクラス名とJavaメソッドの名前、引数と戻り値の型を与えれば、Javaメソッドを呼び出すことができる。C++のオブジェクトとJavaのオブジェクトを、JNIを介してマッピングすることで、C++プログラムがJavaのガベージコレクション機能を利用する方法が、下記の特許文献2に記載されている。ただし、Native言語で、Javaのメソッドを呼び出す処理を記述しなければならず、複数の言語での開発が必要となる。
【0004】
スクリプト言語であるRubyからJNIを利用して、Javaライブラリを利用するための技術として、Rjb(RubyJavaBridge)が存在している。Rjbでは、Rubyアプリケーション実行中に、Rubyメソッド名や引数と戻り値の型を解析し、Javaメソッドの名前、引数と戻り値の型に変換することで、Javaメソッドを呼び出すNativeライブラリを予め用意することで、アプリケーション開発者がRubyのみで、Javaライブラリを利用するアプリケーションを開発することを可能にしている。
【先行技術文献】
【特許文献】
【0005】
【特許文献1】特開2010−86218公報
【特許文献2】特開2005−63449公報
【発明の開示】
【発明が解決しようとする課題】
【0006】
しかしながら、上記Rjbのような方法では、プログラム実行中に、Rubyメソッドの引数や戻り値の型を解析する処理が必要になるため、RubyアプリケーションからJavaメソッドを実行する時間は、Javaアプリケーション上でのJavaメソッド実行時間よりも大きくなってしまう。
【0007】
本発明の目的は、JNIを利用して、他言語アプリケーションからJavaメソッドを実行するために必要な時間を削減することが可能なライブラリ変換方法及びプログラムを提供することである。
【課題を解決するための手段】
【0008】
前記の目的を達成するため、本発明に係るプログラミング言語間でのライブラリ変換方法は、Javaクラス名、Javaメソッド名、引数と戻り値の型を格納したテーブルを予め用意しておき、テーブルから取得したJavaクラス名、Javaメソッド名、引数と戻り値の型から、他言語アプリケーションの実行環境上に、Javaメソッドを呼び出すためのメソッドを生成するように構成したものである。
具体的には、本発明に係るプログラミング言語間でのライブラリ変換方法は、OS(オペレーティングシステム)、JavaVM、テーブル生成プログラム、JavaArchiveファイルを搭載するテーブル生成端末と、Java以外の言語で開発されたアプリケーションを実行する他プログラミング言語実行環境と、キャストプログラム、JavaVM、JavaArchiveファイルを搭載するアプリケーション実行端末から成るライブラリ変換環境におけるライブラリ変換方法であって、
前記テーブル生成プログラムが、前記JavaArchiveファイルを解析し、Javaクラス名をクラステーブルに格納するステップと、Javaメソッド名と引数の型と戻り値の型を格納するメソッドテーブルを生成するステップとを備え、
前記キャストプログラムがクラス登録関数及びメソッド登録関数を備え、前記クラス登録関数が前記クラステーブルからJavaクラス名を抽出し、同名のクラスを前記他プログラミング言語実行環境に定義するステップと、前記メソッド登録関数が前記メソッドテーブルからJavaメソッド名と引数の型と戻り値の型を抽出し、同名のJavaメソッドを呼び出す関数を前記他プログラミング言語実行環境に定義するステップとを備えることを特徴とする。
また、前記テーブル生成プログラムが、前記クラステーブルにJavaスーパークラスを特定する情報を格納するステップをさらに備え、
前記キャストプログラムが、前記クラステーブルからJavaスーパークラスを特定する情報を抽出し、Javaのクラス階層を前記他プログラミング言語実行環境上に反映するステップをさらに備えることを特徴とする。
また、前記キャストプログラムがキャスト関数を備え、このキャスト関数により前記メソッドテーブルからJavaメソッドの引数と戻り値の型を抽出し、引数と戻り値を、前記他プログラミング言語実行環境上でのデータフォーマットと前記JavaVM上でのデータフォーマットに相互に変換するステップとをさらに備え、Javaメソッドを呼び出す前後に前記キャスト関数を呼び出すステップをさらに備えることを特徴とする。
【0009】
また、本発明に係るプログラミング言語間でのライブラリ変換プログラムは、OS(オペレーティングシステム)、JavaVM、テーブル生成プログラム、JavaArchiveファイルを搭載するテーブル生成端末と、Java以外の言語で開発されたアプリケーションを実行する他プログラミング言語実行環境と、キャストプログラム、JavaVM、JavaArchiveファイルを搭載するアプリケーション実行端末から成るライブラリ変換環境において実行されるプログラムであって、
前記テーブル生成プログラムが、前記JavaArchiveファイルを解析し、Javaクラス名をクラステーブルに格納するステップと、Javaメソッド名と引数の型と戻り値の型を格納するメソッドテーブルを生成するステップとを備え、
前記キャストプログラムがクラス登録関数及びメソッド登録関数を備え、前記クラス登録関数が前記クラステーブルからJavaクラス名を抽出し、同名のクラスを前記他プログラミング言語実行環境に定義するステップと、前記メソッド登録関数が前記メソッドテーブルからJavaメソッド名と引数の型と戻り値の型を抽出し、同名のJavaメソッドを呼び出す関数を前記他プログラミング言語実行環境に定義するステップとを備えることを特徴とする。
また、前記テーブル生成プログラムが、前記クラステーブルにJavaスーパークラスを特定する情報を格納するステップをさらに備え、
前記キャストプログラムが、前記クラステーブルからJavaスーパークラスを特定する情報を抽出し、Javaのクラス階層を前記他プログラミング言語実行環境上に反映するステップをさらに備えることを特徴とする。
また、前記キャストプログラムがキャスト関数を備え、このキャスト関数により前記メソッドテーブルからJavaメソッドの引数と戻り値の型を抽出し、引数と戻り値を、前記他プログラミング言語実行環境上でのデータフォーマットと前記JavaVM上でのデータフォーマットに相互に変換するステップとをさらに備え、Javaメソッドを呼び出す前後に前記キャスト関数を呼び出すステップをさらに備えることを特徴とする。
【発明の効果】
【0010】
本発明によれば、JNIを利用して、他言語アプリケーションから、Javaメソッドを実行するために必要な時間を削減することができる。
【図面の簡単な説明】
【0011】
【図1】本発明のプログラミング言語間でのライブラリ変換方法及びプログラムを実施するシステムの機能ブロック図である。
【図2】クラステーブル111の構成図である。
【図3】メソッドテーブル112の構成図である。
【図4】型テーブル113の構成図である。
【図5】テーブル生成プログラム101のクラステーブルとメソッドテーブル112生成処理を説明するためのフローチャートである。
【図6】JavaArchiveファイル102の解凍後のディレクトリ構成図である。
【図7】テーブル生成プログラム101によるクラステーブル生成処理を説明するフローチャートである。
【図8】テーブル生成プログラム101によるメソッドテーブル112生成処理を説明するためのフローチャートである。
【図9】テーブル生成プログラム101によるメソッドテーブル112へのコンストラクタ登録処理を説明するためのフローチャートである。
【図10】テーブル生成プログラム101によるメソッドテーブル112へのメソッド登録処理を説明するためのフローチャートである。
【図11】Ruby実行端末120上のソフトウェアの機能詳細図である。
【図12】RData構造体1103の構成図である。
【図13】キャスト済みメソッドテーブル1240の構成図である。
【図14】キャスト済みクラステーブル1125の構成図である。
【図15】引数キャスト関数テーブル1126の構成図である。
【図16】戻り値キャスト関数テーブル1127の構成図である。
【図17】クラス登録関数1121によるJavaクラスのRubyクラスへの変換処理を説明するためのフローチャートである。
【図18】図17の続きを示すフローチャートである。
【図19】Rubyアプリケーション121が、Javaクラスから変換されたRubyクラスのオブジェクト生成処理を説明するためのフローチャートである。
【図20】メソッド登録関数1122によるJavaメソッドのRubyメソッドへの変換処理を説明するためのフローチャートである。
【図21】Rubyアプリケーション121が、Javaメソッドから変換されたRubyメソッドを呼び出す処理を説明するためのフローチャートである。
【発明を実施するための形態】
【0012】
以下、図面を参照して本発明の実施形態について説明する。
図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クラスのメソッドを利用するための機能である。
【0013】
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から成る。
【0014】
クラステーブル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と表記している。
【0015】
メソッドテーブル112の構成を図3に示す。
メソッドテーブル112は、1レコードに1つのJavaメソッドの情報が格納されるテーブルで、クラスID、メソッドID、メソッド名、シグネチャ、引数型ID、戻り値型IDからなる。
メソッドIDは、Javaメソッドに一意に割り振られる値である。
メソッド名は、Javaメソッドの名前であり、コンストラクタは<init>で表す。メソッドシグネチャは、メソッドを識別するために用いられる引数と戻り値の型のリストであり、jmethodIDを得るために必要である。図3のsetTextメソッドの場合では、1つのchar配列型と2つのint型の引数を持ち、戻り値はvoidであるため、([CII]Vとなる。引数型IDは、引数の型と型テーブル113を関連付けるためのIDである。戻り値型IDは、戻り値の型と型テーブル113を関連付けるためのIDである。
【0016】
型テーブル113の構成を図4に示す。
型テーブル113は、変数のデータ型とシグネチャに一意の値を割り当てて格納したテーブルである。シグネチャは、メソッドシグネチャを生成するために必要である。
データ型がJavaオブジェクトの場合、Lとクラス名と;を連結した文字列がシグネチャとなるが、このテーブルでは、先頭のLのみを格納している。
データ型がchar配列型、int型であれば、シグネチャは[C、Iで表される。
また、android/widget/Textviewクラスのオブジェクトの場合は、シグネチャはLとなる。前記のメソッドテーブル112では、setTextメソッドの引数型IDは、char配列型のIDである3とint型のIDである5が2つ、スラッシュで区切られて格納される。setTextメソッドの戻り値型IDは、voidのIDである0が入る。
【0017】
図5は、テーブル生成プログラム101による、クラステーブル111とメソッドテーブル112生成処理のフローチャートである。
ステップS501では、JavaArchiveファイル102を解凍する。JavaArchiveファイル102の解凍後のディレクトリ構造の一例を図6に示す。
図6では、JavaArchiveファイル102には、TextView.classとView.class、Object.classの3つのクラスファイルが含まれている。
ステップS501の後は、図7に示すクラステーブル111の生成フローチャートと図8に示すメソッドテーブル112の生成フローチャートに進む。
【0018】
図7は、テーブル生成プログラム101によるクラステーブル111の生成処理のフローチャートである。
ステップS701では、テーブル生成プログラム101が、ステップS501で解凍、生成されたJavaクラスファイルの、解凍後のディレクトリ構造のtopディレクトリからの相対パスを取得する。図6の例では、TextView.classの相対パスは、android/widget/TextView.classとなる。
ステップS702では、テーブル生成プログラム101が、ステップS701で取得したJavaクラスファイルの相対パスから拡張子である.classを取り除いて、クラス名を生成する。図6の例では、相対パスのandroid/widget/TextView.classから拡張子を取り除き、クラス名android/widget/TextViewを生成する。
【0019】
ステップS703では、テーブル生成プログラム101が、クラステーブル111からステップS702で取得したクラス名を検索する。同じクラス名が既に存在する場合は、検索にヒットしたレコードのクラスIDを抽出し、ステップS704に進み、存在しない場合は、ステップS704に進む。
ステップS704では、テーブル生成プログラム101が、ステップS702で生成したクラス名にクラスIDを割り当て、クラステーブル111に格納する。図2の例では、android/widget/TextViewクラスに、クラスIDとして2を割り当てて、クラステーブル111に格納している。
【0020】
ステップS705では、Javaクラスローダー104が、ステップS702で生成したクラス名のJavaクラスファイルを読み込み、Javaクラスオブジェクトを生成する。Javaクラスオブジェクトは、java/lang/Classクラスのオブジェクトであり、特定のJavaクラスのシグネチャ、メソッドやスーパークラスの情報の取得やアクセスを行うための機能を備える。
ステップS706では、テーブル生成プログラム101が、ステップS705で生成したJavaクラスオブジェクトからスーパークラスのJavaクラスオブジェクトを取得し、スーパークラスのJavaクラスオブジェクトからスーパークラス名を取得する。
android/widget/TextViewクラスのスーパークラスがandroid/view/Viewクラスである場合、android/widget/TextViewクラスのJavaクラスオブジェクトから、android/view/ViewクラスのJavaクラスオブジェクトが取得でき、android/view/ViewクラスのJavaクラスオブジェクトからクラス名を表すandroid/view/View文字列を取得することができる。
【0021】
ステップS707では、ステップS706でスーパークラス名が取得できた場合は、ステップS708に進み、取得できなかった場合は、処理を終了する。
ステップS708では、テーブル生成プログラム101が、クラステーブル111からステップS706で取得したスーパークラス名を検索する。同じクラス名が既に存在する場合は、ステップS710に進み、存在しない場合は、ステップS709に進む。
android/widget/TextViewクラスの場合では、スーパークラスであるandroid/view/Viewクラスが、図2に示すように既にクラステーブル111に存在する場合、ステップS710に進む。
【0022】
ステップS709では、テーブル生成プログラム101が、ステップS706で取得したスーパークラス名にクラスIDを割り当て、クラステーブル111に格納する。
ステップS710では、テーブル生成プログラム101が、ステップS708で検索にヒットしたレコードからクラスIDを抽出する。図2の例では、android/view/Viewクラスのクラス名を持つレコードのクラスIDである1を抽出する。
【0023】
ステップS711では、テーブル生成プログラム101が、クラステーブル111にステップS709で割り当てたクラスIDもしくはステップS710で抽出したクラスIDを、スーパークラスIDとして、クラステーブル111に格納する。図2の例では、android/widget/TextViewのスーパークラスIDに、ステップS710で抽出したクラスID1を格納している。
【0024】
図8は、テーブル生成プログラム101によるメソッドテーブル112生成処理のフローチャートである。
メソッドテーブル112の生成処理は図9のコンストラクタ登録処理と図10のメソッド登録処理からなる。
【0025】
図9は、テーブル生成プログラム101によるメソッドテーブル112へのコンストラクタ登録処理のフローチャートである。
ステップS901では、ステップS705で取得したJavaクラスオブジェクトからコンストラクタオブジェクトを取得する。コンストラクタオブジェクトは、Javaクラスのコンストラクタの情報とコール機能を提供するオブジェクトであり、java/lang/Classクラスのメソッドにより、取得できる。
ステップS902では、ステップS901で取得したコンストラクタオブジェクトから引数クラスオブジェクトを取得する。引数クラスオブジェクトとは、メソッドもしくはコンストラクタの引数となるJavaクラスのJavaクラスオブジェクトである。なお、引数の型が、boolean、byte、char配列、short、int、long、float、double、voidであり、Javaクラスで無い場合でも、Javaクラスオブジェクトとして扱うことができる。android/widget/TextViewクラスのコンストラクタの引数の型を、android/content/Contextクラスとすると、ステップS902では、android/content/ContextクラスのJavaクラスオブジェクトを取得できる。
【0026】
ステップS903では、ステップS902で取得した引数クラスオブジェクトから引数のシグネチャを取得する。android/content/ContextクラスのJavaクラスオブジェクトからは、Landroid/content/Context;を文字列として取得することができる。
ステップS904では、ステップS903で取得した引数のシグネチャを、型IDテーブルのシグネチャを参照して、引数型IDに変換する。引数が複数ある場合は、/を加えて連結する。引数のシグネチャが、Landroid/content/Context;の場合、型IDは9となる。
【0027】
ステップS905では、ステップS903で取得した引数のシグネチャからメソッドシグネチャを生成する。メソッドシグネチャのフォーマットは([引数のシグネチャ])[戻り値のシグネチャであり、Javaメソッド呼出関数1113ではコンストラクタの戻り値はVoid型として扱われ、シグネチャはVとなるため、android/widget/TextViewクラスのコンストラクタのメソッドシグネチャは、図3に示すように(Landroid/content/Context;)Vとなる。
【0028】
ステップS906では、コンストラクタにメソッドIDを割り当て、ステップS703で抽出したクラスID、またはステップS704で割り当てたクラスIDと、メソッドIDと、ステップS905で生成したメソッドシグネチャと、ステップS904で変換した引数型IDと、Void型の戻り値型IDをメソッドテーブル112に格納する。
【0029】
android/widget/TextViewクラスのコンストラクタの場合は、図3のように、メソッドIDとして1を割り当て、android/widget/TextViewクラスのクラスIDである2と、メソッドIDとして1と、コンストラクタを表すメソッド名<init>と、メソッドシグネチャ(Landroid/content/Context;)Vと、引数型IDとして9と、戻り値型IDとして0を格納する。
【0030】
図10は、テーブル生成プログラム101によるメソッドテーブル112へのメソッド登録処理のフローチャートである。
ステップS1001では、ステップS705で取得したJavaクラスオブジェクトからJavaメソッドオブジェクトを取得する。Javaメソッドオブジェクトは、Javaメソッドの情報とコール機能を提供するオブジェクトであり、java/lang/Classクラスのメソッドにより取得できる。
図3に示したandroid/widget/TextViewクラスの場合では、getTextメソッドとsetTextメソッドのJavaメソッドオブジェクトが取得できる。
【0031】
ステップS1002では、ステップS1001で取得したJavaメソッドオブジェクトからメソッド名を取得する。前記setTextメソッドのJavaメソッドオブジェクトからは、setText文字列を取得できる。
ステップS1003では、ステップS1001で取得したJavaメソッドオブジェクトから引数クラスオブジェクトを取得する。前記setTextメソッドの場合では、char配列型のJavaクラスオブジェクトとint型のJavaクラスオブジェクト2つが取得できる。
【0032】
ステップS1004では、ステップS1003で取得した引数クラスオブジェクトから引数のシグネチャを取得する。前記setTextメソッドの場合では、char配列型を表すCと、int型を表すIを2つ取得できる。
ステップS1005では、ステップS1004で取得した引数のシグネチャを、型IDテーブルのシグネチャを参照して、引数型IDに変換する。前記setTextメソッドの場合では、引数のシグネチャはCと2つのIであり、引数型IDは3/5/5となる。
【0033】
ステップS1006では、ステップS1001で取得したJavaメソッドオブジェクトから戻り値クラスオブジェクトを取得する。戻り値クラスオブジェクトとは、メソッドの戻り値となるJavaクラスのJavaクラスオブジェクトである。
ステップS1007では、ステップS1006で取得した戻り値クラスオブジェクトから戻り値のシグネチャを取得する。前記setTextメソッドの場合では、void型を表すVを取得できる。
ステップS1008では、ステップS1007で取得した戻り値のシグネチャを、型IDテーブルのシグネチャを参照して、戻り値型IDに変換する。前記setTextメソッドの場合では、戻り値のシグネチャはVであり、戻り値型IDは0となる。
【0034】
ステップS1010では、ステップS1004で取得した引数のシグネチャとステップS1007で取得した戻り値のシグネチャからメソッドシグネチャを生成する。前記setTextメソッドの場合では、([CII]Vとなる。
ステップS1011では、メソッドにメソッドIDを割り当て、ステップS703で抽出したクラスID、またはステップS704で割り当てたクラスIDと、メソッドIDと、ステップS1010で生成したメソッドシグネチャと、ステップS1005で変換した引数型IDと、ステップS1008で取得した戻り値型IDをメソッドテーブル112に格納する。
【0035】
前記setTextメソッドの場合では、図3のように、メソッドIDとして2を割り当て、android/widget/TextViewクラスのクラスIDである2と、メソッドIDとして2と、メソッド名setTextと、メソッドシグネチャ([CII)Vと、引数型IDとして3/5/5と、戻り値型IDとして0を格納する。
【0036】
図11は、Ruby実行端末120上のRubyインタプリタ122、キャストプログラム123、DalvikVM125の機能構成図である。
Rubyインタプリタ122は、Ruby拡張ライブラリ1100を備える。Ruby拡張ライブラリ1100はNative言語からRubyにクラスとメソッドを追加する機能を提供するライブラリであり、クラス追加関数1101とメソッド追加関数1102とRData構造体1103を含む。クラス追加関数1101とメソッド追加関数1102は、それぞれRubyインタプリタ122上にRubyクラスとRubyメソッドを追加する機能を有する。RData構造体1103は、RubyクラスとRubyオブジェクトの実体である。
【0037】
RData構造体1103の構成を図12に示す。本実施形態では、JavaクラスのRubyクラスへの変換のために、RData構造体1103のメンバにrclass構造体1210を追加している。*はポインタを表し、*rclass1201はrclassのポインタである。rclass構造体1210のメンバには、*rconstructor1211、rmethod配列、jobject1213、jclass1214、*キャスト済みメソッドテーブル1215、クラスIDが含まれる。
*rconstructor1211は、rconstructor構造体1220へのポインタである。rconstructor構造体1220は、Javaクラスから変換されたRubyクラスのコンストラクタの処理に必要な値と関数をメンバに持つ構造体であり、*cargs配列1221、*cargcast関数配列1222、jmethodID1223がメンバである。
【0038】
cargs配列は、Rubyコンストラクタとしてキャストコンストラクタ関数1123が受け取った引数をDalvikVM125のデータフォーマットに変換した値を格納する配列である。cargcast関数配列は、Rubyコンストラクタとしてキャストコンストラクタ関数1123が受け取った引数をDalvikVM125のデータフォーマットに変換する関数であるキャスト関数を格納する配列である。
jmethodID1223は、Javaのコンストラクタのポインタである。
rmethod構造体1230は、Javaメソッドから変換されたRubyメソッドであり、Rubyアプリケーション121が、Javaメソッドを呼び出すために必要な値と関数をメンバに持つ構造体であり、*margs配列1231、*margcast関数配列1232、*returncast関数1233、jmethodID1234がメンバである。
【0039】
margs配列は、Rubyメソッドとしてjmethod_missing関数1124が受け取った引数をDalvikVM125のデータフォーマットに変換した値を格納する配列である。
margcast関数配列は、Rubyメソッドとしてjmethod_missing関数1124が受け取った引数をDalvikVM125のデータフォーマットに変換する関数であるキャスト関数を格納する配列である。
returncast関数は、Javaメソッドの戻り値をRubyインタプリタ122のデータフォーマットに変換する関数であるキャスト関数である。
【0040】
jmethodID1234は、Javaメソッドのポインタである。
jobject1213は、Javaオブジェクトへのポインタである。
jclass1214は、Javaクラスオブジェクトへのポインタである。
キャスト済みメソッドテーブル1240は、メソッドテーブル112からrmethod構造体1230のインスタンスを生成済みのメソッドを格納するテーブルである。
【0041】
キャスト済みメソッドテーブル1240の一例を図13に示す。
メソッド番号はrmethod配列の位置であり、Rmethod構造体1230のインスタンスの重複生成を防止すると同時に、メソッド名と対応するrmethod構造体1230のインスタンスを検索する目的も持つ。図13の場合では、getTextメソッドが既にRmethod構造体1230に変換済みである。
RData構造体1103インスタンス、rclass構造体1210インスタンス、rconstructor構造体1220インスタンスは、Javaクラスから変換されたRubyクラス一つ毎に生成される。また、rmethod構造体1230のインスタンスは、Javaメソッドの数だけ生成される。
【0042】
キャストプログラム123は、クラス登録関数1121、メソッド登録関数1122、キャストコンストラクタ関数1123、jmethod_missing関数1124、キャスト済みクラステーブル1125、引数キャスト関数テーブル1126、戻り値キャスト関数テーブル1127を備える。
【0043】
クラス登録関数1121は、クラステーブル111内にあるJavaクラスを、Rubyクラスに変換する機能を有する。
メソッド登録関数1122は、メソッドテーブル112内にあるJavaメソッドを、Rubyメソッドに変換する機能を有する。キャストコンストラクタ関数1123は、Javaクラスから変換された全てのRubyクラスのコンストラクタであり、Javaオブジェクトを格納するRubyオブジェクトを生成する機能を有する。
jmethod_missing関数1124は、Javaクラスから変換されたすべてのRubyクラスのmethod_missingメソッドであり、呼び出されたRubyメソッドの名前と同名のJavaメソッドを呼び出す機能を有する。
【0044】
Rubyのmethod_missingメソッドは、Rubyアプリケーション121が存在しないメソッドaを呼び出した時に呼び出されるメソッドであり、Rubyアプリケーション121からメソッドの呼出元のRubyオブジェクト、メソッド名a、メソッドaの引数を受け取り、処理を行う。
キャスト済みクラステーブル1125は、クラス登録関数1121により、Javaクラスから変換されたRubyクラスを格納するテーブルであり、クラスの変換処理を重複して行うことを防ぐ目的がある。
【0045】
キャスト済みクラステーブル1125の一例を図14に示す。図14の場合では、java/lang/Objectクラスとandroid/view/Viewクラスが既にRubyクラスに変換済みである。
引数キャスト関数テーブル1126は、Rubyインタプリタ122のデータフォーマットを持つ値をDalvikVM125103のデータフォーマットの値に変換するキャスト関数のポインタを格納している。
【0046】
引数キャスト関数テーブル1126の一例を図15に示す。テーブル中の型IDは、キャスト関数が変換する値の型IDである。戻り値キャスト関数テーブル1127は、DalvikVM125のデータフォーマットを持つ値をRubyインタプリタ122のデータフォーマットの値に変換するキャスト関数のポインタを格納している。
【0047】
戻り値キャスト関数テーブル1127の一例を図16に示す。テーブル中の型IDは、キャスト関数が変換する値の型IDである。引数キャスト関数テーブル1126と戻り値キャスト関数テーブル1127は、Rubyインタプリタ122起動時に作成する。
JNIライブラリ1110は、Native言語からJavaクラスローダー104を利用する機能を提供するライブラリであり、Javaクラス取得関数1111、Javaメソッド取得関数1112、Javaメソッド呼出関数1113を含む。
Javaクラス取得関数1111は、Javaクラスローダー104を利用して、Javaクラスオブジェクトを生成し、Javaクラスオブジェクトのポインタであるjclass1214を取得する機能を有する。
Javaメソッド取得関数1112は、Javaクラスローダー104を利用して、JavaメソッドのポインタであるjmethodID1223、1234を取得する機能を有する。
Javaメソッド呼出関数1113は、jmethodID1223、1234の示すJavaメソッドを呼び出す機能を有する。
【0048】
図17は、クラス登録関数1121によるクラス名AのJavaクラスのRubyクラスへの変換処理のフローチャートである。
ステップS1701では、クラス登録関数1121が、キャスト済みクラステーブル11251125からクラス名Aを検索する。キャスト済みクラステーブル1125にクラス名Aが存在する場合は、処理を終了し、存在しない場合は、ステップS1702に進む。
ステップS1702では、クラス登録関数1121が、クラステーブル111からクラス名Aを検索し、クラスIDとスーパークラスIDを抽出する。android/widget/TextViewクラスを変換する場合では、クラステーブル111からクラスID2とスーパークラスID1が抽出される。
【0049】
ステップS1703では、ステップS1702でスーパークラスIDが抽出された場合、ステップS1704に進み、存在しなかった場合、ステップS1706に進む。
ステップS1704では、クラス登録関数1121が、クラステーブル111のクラスIDに対し、ステップS1703で抽出したスーパークラスIDを検索し、スーパークラスのクラス名SAを抽出し、クラス名SAのJavaクラスのRubyクラスへの変換処理を行い、ステップS1705に進む。
android/widget/TextViewクラスの場合、クラステーブル111のクラスID1のレコードが検索にヒットし、クラス名android/view/Viewが抽出される。
【0050】
ステップS1705では、クラス登録関数1121が、rclass構造体1210のメモリ領域を確保し、rclass構造体1210のインスタンスを生成し、ステップS1702で抽出したクラスIDを1216に格納する。
ステップS1706では、クラス登録関数1121が、クラス名Aを引数に、Javaクラス取得関数1111を呼び出し、Javaクラスオブジェクトを生成し、jclass1214を取得し、rclass構造体1210のインスタンスに格納する。
【0051】
ステップS1707では、クラス登録関数1121が、メソッドテーブル112から、ステップS1702で抽出したクラスIDとコンストラクタを表すメソッド名<init>を検索し、メソッドシグネチャと引数型IDを抽出する。
android/widget/TextViewクラスの場合、メソッドテーブル112からクラスID2とメソッド名<init>を検索し、メソッドシグネチャ(Landroid/content/Context);Vと引数型ID9を抽出する。
【0052】
ステップS1708では、クラス登録関数1121が、メソッド名<init>とメソッドシグネチャを引数に、Javaメソッド取得関数1112を呼び出し、jmethodIDを取得する。
ステップS1709では、クラス登録関数1121が、rconstructor構造体1220のメモリ領域を確保し、rconstructor構造体1220のインスタンスを生成し、jmethodIDを格納する。
【0053】
ステップS1710では、クラス登録関数1121が、ステップS1707で抽出した引数型IDを引数キャスト関数テーブル1126から検索し、キャスト関数ポインタを抽出する。引数が複数ある場合、キャスト関数ポインタも複数抽出される。
android/widget/TextViewクラスの場合、引数型IDは9であるため、*j2robjectが抽出される。
ステップS1711では、クラス登録関数1121が、ステップS1709で生成したRrconstructor構造体1220のインスタンスのcargcast関数配列に、ステップS1710で抽出したキャスト関数ポインタを格納する。
【0054】
ステップS1712では、クラス登録関数1121が、RData構造体1103のメモリ領域を確保し、RData構造体1103のインスタンスを生成し、ステップS1705で生成したrclass構造体1210のインスタンスのポインタを格納する。
ステップS1713では、ステップS1702でスーパークラスIDが抽出された場合、ステップS1714に進み、存在しなかった場合、ステップS1715に進む。
【0055】
ステップS1714では、クラス登録関数1121が、ステップS1704で抽出されたクラス名SAを持つRubyクラスのサブクラスとして、ステップS1712で生成されたRData構造体1103のインスタンスをクラス名AのRubyクラスに登録する。
【0056】
ステップS1715では、クラス登録関数1121が、RubyのObjectクラスのサブクラスとして、ステップS1712で生成されたRData構造体1103のインスタンスをクラス名AのRubyクラスに登録する。RubyのObjectクラスは、Rubyのクラス階層のルートに存在するクラスであり、Objectクラスにスーパークラスは存在しない。
ステップS1716では、クラス登録関数1121が、キャスト済みクラステーブル1125にクラス名Aを格納する。
【0057】
ステップS1717では、クラス登録関数1121が、メソッド追加関数1102を呼び出し、クラス名AのRubyクラスのコンストラクタに、キャストコンストラクタ関数1123のポインタを登録する。
ステップS1718では、クラス登録関数1121が、メソッド追加関数1102を呼び出し、クラス名AのRubyクラスのmethod_missingメソッドにjmethod_missing関数1124のポインタを登録する。
【0058】
図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クラスのオブジェクトを引数として受け取り、呼び出される。
【0059】
ステップ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に格納する。
【0060】
ステップS1903では、キャストコンストラクタ関数1123が、ステップS1902でargs配列に格納された戻り値を引数として渡し、ステップS1901で取得したRDataからjconstructor構造体1220のjmethodID1223の示すJavaコンストラクタを呼び出し、戻り値としてjobjectを取得する。
ステップS1903では、キャストコンストラクタ関数1123が、ステップS1901で取得したRData構造体1103のメンバであるrclass構造体1210に、ステップS1903で取得したjobject1213を格納する。
【0061】
ステップS1904では、キャストコンストラクタ関数1123が、ステップS1901で取得したRData構造体1103のインスタンスを、Rubyインタプリタ122にRubyクラスのコンストラクタの戻り値として渡す。
android/widget/TextViewクラスを変換したRubyクラスのコンストラクタの場合では、android/widget/TextViewクラスのjobject1213にjclass1214経由でアクセス可能なRData構造体1103のインスタンスをRubyインスタンスとしてRubyインタプリタ122に渡す。
【0062】
図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メソッドの場合、メソッドシグネチャ([CII)V、引数型ID3/5/5、戻り値型ID0が抽出される。
【0063】
ステップS2004では、メソッド登録関数1122が、メソッド名aとステップS2003で抽出したシグネチャを引数に、Javaメソッド取得関数1112を呼び出し、jmethodIDを取得する。
ステップS2005では、メソッド登録関数1122が、rmethod構造体1230のメモリ領域を確保し、インスタンスを生成し、ステップS1904で取得したjmethodIDを格納する。
【0064】
ステップS2006では、メソッド登録関数1122が、ステップS2003で抽出した引数型IDを引数キャスト関数テーブル1126から検索し、キャスト関数ポインタを抽出し、margcast関数配列に格納する。
メソッド名aのメソッドに引数が複数存在する時は、スラッシュで区切られた複数の引数型ID、それぞれを引数キャスト関数テーブル1126から検索し、抽出されたキャスト関数ポインタをmargcast関数配列に格納する。引数型IDが0の場合、引数の変換は不要なため、margcast関数配列には何も格納されない。
setTextメソッドの場合、引数型IDは3,5,5であり、引数キャスト関数テーブル1126から*r2jchararray、*r2jint、*r2jintが抽出され、margcast関数配列1232に格納される。
【0065】
ステップS2007では、メソッド登録関数1122が、ステップS2003で抽出した戻り値型IDを戻り値キャスト関数テーブル1127から検索し、キャスト関数ポインタを抽出し、*returncast関数1233に格納する。
戻り値型IDが0の場合、戻り値の変換は不要なため、*returncast関数1233には何も格納されない。setTextメソッドの場合、戻り値型IDは0であり、*returncast関数1233には何も格納されない。
【0066】
ステップS2008では、メソッド登録関数1122が、ステップS2005で生成したrmethod構造体1230のインスタンスのポインタを、クラス名AとしてステップS1714もしくはステップS1715でRubyインタプリタ122に登録したRData構造体1103のメンバのrclass構造体1210のメンバのrmethod配列に格納する。
【0067】
ステップ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が格納される。
【0068】
図21は、Rubyアプリケーション121が、Javaメソッドから変換されたRubyメソッドを呼び出す処理のフローチャートである。
ステップS2101では、Rubyインタプリタ122上で実行されているRubyアプリケーション121が、ステップS1714もしくはステップS1715で登録されたRubyクラスAのメソッドaを呼び出す。
【0069】
ステップS2102では、Rubyインタプリタ122が、メソッドaのメソッド名、メソッドaの引数、RubyクラスAとして登録されたRData構造体1103のインスタンスを渡して、RubyクラスAのmethod_missingメソッドとして登録されているjmethod_missing関数1124を呼び出す。
【0070】
ステップS2103では、jmethod_missing関数1124が、ステップS2102で受け取ったメソッド名をキャスト済みメソッドテーブル1240から検索し、メソッド番号を抽出する。クラス名がandroid/widget/TextViewで、メソッド名がsetTextだった場合、ステップS1708で格納されたメソッド番号1が抽出される。
【0071】
ステップ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配列に格納する。
【0072】
ステップS2105では、jmethod_missing関数1124が、ステップS2104で取得したrmethod構造体1230メンバのmargs配列内の値を渡して、ステップS2104で取得したrmethod構造体1230メンバのjmethodID1234をJavaメソッド取得関数1112に渡して、Javaメソッドを呼び出す。
ステップS2101で呼び出されたメソッドが、setTextメソッドであれば、JavaのsetTextが、DalvikVM125上で扱える型に変換されたchar配列と2つのint値を引数として、呼び出される。
【0073】
ステップS2106では、jmethod_missing関数1124が、ステップS2105で呼び出されたJavaメソッドの戻り値を、ステップS2104で取得したrmethod構造体1230メンバのreturncast関数に渡して、呼び出す。
ステップS2101で呼び出されたメソッドが、setTextメソッドであれば、戻り値はvoid型であり、*returncast関数1233には、何も格納されておらず、returncast関数は呼び出されない。
【0074】
ステップS2107では、jmethod_missing関数1124が、ステップS2106で呼び出したreturncast関数の戻り値を、Rubyメソッドaの戻り値としてRubyインタプリタ122上で動作するRubyアプリケーション121に返す。
【符号の説明】
【0075】
100 テーブル生成端末
101 テーブル生成プログラム
102 JavaArchiveファイル
103 JavaVM
104 Javaクラスローダー
105 OS
110 JavaAPIテーブル
111 クラステーブル
112 メソッドテーブル
113 型テーブル
120 Ruby実行端末
121 Rubyアプリケーション
122 Rubyインタプリタ
123 キャストプログラム
124 JavaArchiveファイル
125 DalvikVM
126 AndroidOS
1100 Ruby拡張ライブラリ
1101 クラス追加関数
1102 メソッド追加関数
1103 RData構造体
1110 JNIライブラリ
1111 Javaクラス取得関数
1112 Javaメソッド取得関数
1113 Javaメソッド呼出関数
1121 クラス登録関数
1122 メソッド登録関数
1123 キャストコンストラクタ関数
1124 jmethod_missing関数
1125 キャスト済みクラステーブル
1126 引数キャスト関数テーブル
1127 戻り値キャスト関数テーブル
1201 *rclass
1210 rclass構造体
1211 *rconstructor
1212 *rmethod配列
1213 jobject
1214 jclass
1215 *キャスト済みメソッドテーブル
1216 クラスID
1220 rconstructor構造体
1221 *args配列
1222 *argcast関数配列
1223 jmethodID
1230 rmethod構造体
1231 *args配列
1232 *argcast関数配列
1233 *returncast関数
1234 jmethodID
1240 キャスト済みメソッドテーブル

【特許請求の範囲】
【請求項1】
OS、JavaVM、テーブル生成プログラム、JavaArchiveファイルを搭載するテーブル生成端末と、Java以外の言語で開発されたアプリケーションを実行する他プログラミング言語実行環境と、キャストプログラム、JavaVM、JavaArchiveファイルを搭載するアプリケーション実行端末から成るライブラリ変換環境におけるライブラリ変換方法であって、
前記テーブル生成プログラムが、前記JavaArchiveファイルを解析し、Javaクラス名をクラステーブルに格納するステップと、Javaメソッド名と引数の型と戻り値の型を格納するメソッドテーブルを生成するステップとを備え、
前記キャストプログラムがクラス登録関数及びメソッド登録関数を備え、前記クラス登録関数が前記クラステーブルからJavaクラス名を抽出し、同名のクラスを前記他プログラミング言語実行環境に定義するステップと、前記メソッド登録関数が前記メソッドテーブルからJavaメソッド名と引数の型と戻り値の型を抽出し、同名のJavaメソッドを呼び出す関数を前記他プログラミング言語実行環境に定義するステップとを備えることを特徴とするプログラミング言語間でのライブラリ変換方法。
【請求項2】
前記テーブル生成プログラムが、前記クラステーブルにJavaスーパークラスを特定する情報を格納するステップをさらに備え、
前記キャストプログラムが、前記クラステーブルからJavaスーパークラスを特定する情報を抽出し、Javaのクラス階層を前記他プログラミング言語実行環境上に反映するステップをさらに備えることを特徴とする請求項1に記載のプログラミング言語間でのライブラリ変換方法。
【請求項3】
前記キャストプログラムがキャスト関数を備え、このキャスト関数により前記メソッドテーブルからJavaメソッドの引数と戻り値の型を抽出し、引数と戻り値を、前記他プログラミング言語実行環境上でのデータフォーマットと前記JavaVM上でのデータフォーマットに相互に変換するステップとをさらに備え、Javaメソッドを呼び出す前後に前記キャスト関数を呼び出すステップをさらに備えることを特徴とする請求項2に記載のプログラミング言語間でのライブラリ変換方法。
【請求項4】
OS、JavaVM、テーブル生成プログラム、JavaArchiveファイルを搭載するテーブル生成端末と、Java以外の言語で開発されたアプリケーションを実行する他プログラミング言語実行環境と、キャストプログラム、JavaVM、JavaArchiveファイルを搭載するアプリケーション実行端末から成るライブラリ変換環境において実行されるプログラムであって、
前記テーブル生成プログラムが、前記JavaArchiveファイルを解析し、Javaクラス名をクラステーブルに格納するステップと、Javaメソッド名と引数の型と戻り値の型を格納するメソッドテーブルを生成するステップとを備え、
前記キャストプログラムがクラス登録関数及びメソッド登録関数を備え、前記クラス登録関数が前記クラステーブルからJavaクラス名を抽出し、同名のクラスを前記他プログラミング言語実行環境に定義するステップと、前記メソッド登録関数が前記メソッドテーブルからJavaメソッド名と引数の型と戻り値の型を抽出し、同名のJavaメソッドを呼び出す関数を前記他プログラミング言語実行環境に定義するステップとを備えることを特徴とするプログラミング言語間でのライブラリ変換プログラム。
【請求項5】
前記テーブル生成プログラムが、前記クラステーブルにJavaスーパークラスを特定する情報を格納するステップをさらに備え、
前記キャストプログラムが、前記クラステーブルからJavaスーパークラスを特定する情報を抽出し、Javaのクラス階層を前記他プログラミング言語実行環境上に反映するステップをさらに備えることを特徴とする請求項4に記載のプログラミング言語間でのライブラリ変換プログラム。
【請求項6】
前記キャストプログラムがキャスト関数を備え、このキャスト関数により前記メソッドテーブルからJavaメソッドの引数と戻り値の型を抽出し、引数と戻り値を、前記他プログラミング言語実行環境上でのデータフォーマットと前記JavaVM上でのデータフォーマットに相互に変換するステップとをさらに備え、Javaメソッドを呼び出す前後に前記キャスト関数を呼び出すステップをさらに備えることを特徴とする請求項5に記載のプログラミング言語間でのライブラリ変換プログラム。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate

【図8】
image rotate

【図9】
image rotate

【図10】
image rotate

【図11】
image rotate

【図12】
image rotate

【図13】
image rotate

【図14】
image rotate

【図15】
image rotate

【図16】
image rotate

【図17】
image rotate

【図18】
image rotate

【図19】
image rotate

【図20】
image rotate

【図21】
image rotate


【公開番号】特開2012−173771(P2012−173771A)
【公開日】平成24年9月10日(2012.9.10)
【国際特許分類】
【出願番号】特願2011−32049(P2011−32049)
【出願日】平成23年2月17日(2011.2.17)
【公序良俗違反の表示】
(特許庁注:以下のものは登録商標)
1.Linux
【出願人】(000233055)株式会社日立ソリューションズ (1,610)