(57)【特許請求の範囲】
【請求項１】
第１の言語で記述され、かつアプリケーションからデバイスを制御する際にアクセスされる第１インターフェースが定義された第１モジュールと、前記第１の言語とは異なる第２の言語で記述され、かつ前記第１インターフェースに対応する第２インターフェースが定義された第２モジュールとを含むデバイスドライバをロードすると共に、前記第２モジュールに定義された前記第２インターフェースに関する情報を取得するロード部と、
前記第１モジュールから受け付けた前記第１インターフェースに関する情報と、前記ロード部により取得された前記第２インターフェースに関する情報とに基づいて、前記第２モジュールに定義された前記第２インターフェースへアクセスするアクセス部と、
を含む情報処理装置。
【請求項２】
前記第１モジュールはウェブ技術で記述され、前記第２モジュールはネイティブ言語で記述された請求項１記載の情報処理装置。
【請求項３】
前記ロード部は、前記第２の言語とは異なる第３の言語で記述され、かつ前記第２インターフェースに対応する第３インターフェースが定義された第３モジュールをさらに含む前記デバイスドライバをロードする際に、前記第３モジュールに定義された前記第３インターフェースに関する情報を取得し、
前記アクセス部は、前記第１モジュールから受け付けた前記第１インターフェースに関する情報と、前記ロード部により取得された前記第２インターフェースに関する情報及び前記第３インターフェースに関する情報とに基づいて、前記第３モジュールに定義された前記第３インターフェースへアクセスする
請求項１又は請求項２記載の情報処理装置。
【請求項４】
前記第２モジュールがロードされている場合には、前記アクセス部に、前記第２インターフェースへアクセスさせ、前記第２モジュールがロードされていない場合には、前記第１モジュールから前記デバイスへアクセスさせるように切り替える切替部を含む請求項１〜請求項３のいずれか１項記載の情報処理装置。
【請求項５】
情報処理装置に搭載されたオペレーティングシステムの種別に応じたデバイスドライバを取得する取得部をさらに含む請求項１〜請求項４のいずれか１項記載の情報処理装置。
【請求項６】
前記ロード部は、前記第１モジュールからの要求により、前記第２モジュールをロードする請求項１〜請求項５のいずれか１項記載の情報処理装置。
【請求項７】
前記ロード部は、前記アクセス部が前記第２インターフェースへアクセスする際に、前記第２モジュールをロードする請求項１〜請求項５のいずれか１項記載の情報処理装置。
【請求項８】
前記ロード部は、前記第１モジュールに付加情報を設定すると共に、前記付加情報を前記アクセス部へ通知し、
前記アクセス部は、前記第１モジュールから受け付けた前記第１インターフェースに関する情報に付加された付加情報と、前記ロード部から通知された付加情報との照合結果に基づいて、前記第２インターフェースへのアクセスを許可するか否かを判定する
請求項１〜請求項７のいずれか１項記載の情報処理装置。
【請求項９】
前記ロード部は、前記第１モジュールからの要求により、又は前記第１モジュールをアンロードする際に、前記第２モジュールをアンロードする請求項１〜請求項８のいずれか１項記載の情報処理装置。
【請求項１０】
前記ロード部により取得された前記第２インターフェースに関する情報に基づいて、前記第１モジュールを生成する生成部をさらに含む請求項１〜請求項９のいずれか１項記載の情報処理装置。
【請求項１１】
前記生成部は、生成した前記第１モジュールを記憶すると共に、第２モジュールがロードされる際に、該第２モジュールに定義された第２インターフェースに対応する第１インターフェースが定義された第１モジュールを、記憶された前記第１モジュールから検索して利用する請求項１０記載の情報処理装置。
【請求項１２】
前記生成部は、同等の機能を有する第２インターフェースを同一の第１インターフェースに対応付けた対応表に基づいて、前記第１モジュールを生成する請求項１０記載の情報処理装置。
【請求項１３】
コンピュータに、
第１の言語で記述され、かつアプリケーションからデバイスを制御する際にアクセスされる第１インターフェースが定義された第１モジュールと、前記第１の言語とは異なる第２の言語で記述され、かつ前記第１インターフェースに対応する第２インターフェースが定義された第２モジュールとを含むデバイスドライバをロードすると共に、前記第２モジュールに定義された前記第２インターフェースに関する情報を取得し、
前記第１モジュールから受け付けた前記第１インターフェースに関する情報と、取得された前記第２インターフェースに関する情報とに基づいて、前記第２モジュールに定義された前記第２インターフェースへアクセスする
ことを含む処理を実行させる情報処理方法。
【請求項１４】
コンピュータに、
第１の言語で記述され、かつアプリケーションからデバイスを制御する際にアクセスされる第１インターフェースが定義された第１モジュールと、前記第１の言語とは異なる第２の言語で記述され、かつ前記第１インターフェースに対応する第２インターフェースが定義された第２モジュールとを含むデバイスドライバをロードすると共に、前記第２モジュールに定義された前記第２インターフェースに関する情報を取得し、
前記第１モジュールから受け付けた前記第１インターフェースに関する情報と、取得された前記第２インターフェースに関する情報とに基づいて、前記第２モジュールに定義された前記第２インターフェースへアクセスする
ことを含む処理を実行させる情報処理プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
開示の技術は、情報処理装置、情報処理方法、及び情報処理プログラムに関する。
【背景技術】
【０００２】
近年、様々なデバイスやセンサがネットワークに接続されるＩｏＴ（Internet of Things）の実現が進められている。これらのデバイスやセンサ（以下、「周辺デバイス」ともいう）をネットワークに接続する方法として、携帯網などを介して直接インターネットに接続する方法がある。また、その他の方法として、人々が持ち歩くスマートフォンやタブレットなどのスマートデバイスを介して接続する場合もある。
【０００３】
周辺デバイスをスマートデバイスから接続して利用するアプリケーション（以下、「アプリケーション」を略して「アプリ」ともいう）を提供しようと考えた場合、アプリは、それらの周辺デバイスに応じた通信プロトコルを実装することが必要である。周辺デバイスに応じた通信プロトコルには、デバイス固有の部分が存在する。そのため、通信プロトコルをスマートデバイスに実装するためには、多くの場合、デバイスメーカーがアプリも作成して、ユーザに提供する。しかし、この場合、利用しようとするデバイス毎にアプリを用意する必要があり、ユーザにとって不便である。
【０００４】
そこで、ＡＰＩ（Application Programming Interface）を利用して周辺デバイスにアクセスできるように、周辺デバイス毎に固有の部分を記述したソフトウェアモジュールを、デバイスメーカーがアプリ開発者に提供する方法もある。例えば、デバイスＷｅｂＡＰＩコンソーシアムでは、デバイスドライバをこのコンソーシアムの仕様に従って作成することで、アプリからＷｅｂＡＰＩ経由でデバイスにアクセスすることができる方式が提案及び実装されている。
【０００５】
また、スマートデバイスで提供されるアプリの形態には、ハイブリッドアプリという形態がある。ハイブリッドアプリとは、例えば、ＨＴＭＬ（HyperText Markup Language）やＪａｖａＳｃｒｉｐｔ（登録商標）などのウェブ技術と、Ｊａｖａ（登録商標）やＣ言語などのネイティブ言語との両方を使用した形態のアプリである。ハイブリッドアプリによれば、ＯＳ（Operating System）が提供するＡＰＩへのアクセスが必要な部分についてはネイティブ言語で記述し、ネイティブ言語で記述された部分へはウェブ技術からアクセスする。これにより、ウェブ技術からＯＳの機能を利用することが可能になる。
【０００６】
すなわち、周辺デバイスにアクセスする部分はネイティブ言語で記述して、ＵＩ（User Interface）を含めたアプリの大半をウェブ技術で記述することができる。また、これにより、ウェブ技術にウェブブラウザを使ってアクセスするのではなく、一つのスマートデバイス上のアプリとして使用することが可能になる。パーソナルコンピュータでは、ウェブブラウザが非常に多く使われている一方で、スマートデバイスではウェブブラウザを介して使用するアプリより、スマートデバイスにインストールして使用するアプリが多い。このような背景を考慮すると、パーソナルコンピュータでウェブブラウザ向けにアプリを開発してきたウェブ技術に精通した開発者が、スマートデバイス向けにアプリを開発することができるハイブリッドアプリという形態は重要である。
【０００７】
ここで、上述のＡＰＩを利用して周辺デバイスにアクセスするデバイスドライバは、ＯＳが提供するＡＰＩを利用するため、ネイティブ言語で記述する必要がある。例えば、Ｂｌｕｅｔｏｏｔｈ（登録商標）で通信するデバイスのデバイスドライバは、ＯＳが提供するＢｌｕｅｔｏｏｔｈに関連するＡＰＩにアクセスする必要があるため、ネイティブ言語で記述される。そこで、デバイスへのアクセスに利用する最低限の機能をネイティブ言語で実現して、デバイスドライバの多くの部分をウェブ技術で記述する方法が提案されている。この方法では、外部デバイスの制御用のデバイスドライバをＯＳに組み込む権限が与えられていない端末装置から外部デバイスを制御可能にするアプリの作成労力を軽減する。具体的には、この方法では、汎用ドライバがＯＳに予め組み込まれており、ドライバライブラリがアプリケーションに含まれている。ドライバライブラリは、アプリケーションが認識可能な形式の第１の制御命令をアプリケーションから与えられ、その第１の制御命令を、外部デバイスへの受け渡しが可能な形式の第２の制御命令に変換する。汎用ドライバは、ドライバライブラリから出力される変換後の第２の制御命令を外部デバイスに送信する。
【先行技術文献】
【特許文献】
【０００８】
【特許文献１】特表２０００−５１０６２６号公報
【特許文献２】特開２００５−１５７４２７号公報
【特許文献３】特開２０１３−２５０７３９号公報
【特許文献４】特開２０１５−１６２２１４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００９】
ＩｏＴの普及に伴い、世の中に様々なデバイスが存在するようになることで、デバイスを持ち歩かなくても、スマートフォンなどの端末のみを持ち歩いて、その場にあるデバイスを利用するような使い方も想定される。従来技術では、汎用ドライバ側を拡張することができないため、汎用ドライバで対応できないデバイスを利用することができない。また、利用される可能性のあるデバイスに対応できるように予め汎用ドライバを作成することは困難である。
【００１０】
開示の技術は、一つの側面として、ハイブリッドアプリケーションで周辺デバイスを利用するためのデバイスドライバを動的に入れ替えることを目的とする。
【課題を解決するための手段】
【００１１】
開示の技術は、一つの側面として、第１モジュールと第２モジュールとを含むデバイスドライバをロードするロード部を備える。第１モジュールは、第１の言語で記述され、かつアプリケーションからデバイスを制御する際にアクセスされる第１インターフェースが定義されている。第２モジュールは、前記第１の言語とは異なる第２の言語で記述され、かつ前記第１インターフェースに対応する第２インターフェースが定義されている。また、ロード部は、前記第２モジュールに定義された前記第２インターフェースに関する情報を取得する。また、開示の技術は、前記第２モジュールに定義された前記第２インターフェースへアクセスするアクセス部を備える。アクセス部は、前記第１モジュールから受け付けた前記第１インターフェースに関する情報と、前記ロード部により取得された前記第２インターフェースに関する情報とに基づいて、第２インターフェースへアクセスする。
【発明の効果】
【００１２】
一つの側面として、ハイブリッドアプリケーションで周辺デバイスを利用するためのデバイスドライバを動的に入れ替えることができる、という効果を有する。
【図面の簡単な説明】
【００１３】
【図１】第１〜第５実施形態に係る情報処理システムの概略構成を示すブロック図である。
【図２】第１実施形態に係るモバイル端末の概略構成を示す機能ブロック図である。
【図３】周辺デバイスのタイプとサービスＵＵＩＤとの対応表の一例を示す図である。
【図４】サービスＵＵＩＤ及びデバイスＩＤとＵＲＬとの対応表の一例を示す図である。
【図５】デバイスドライバの一例を示す図である。
【図６】ＡＰＩテーブルの一例を示す図である。
【図７】第１〜第５実施形態に係るモバイル端末として機能するコンピュータの概略構成を示すブロック図である。
【図８】第１実施形態における情報処理の一例を示すフローチャートである。
【図９】情報処理の概略を説明するための図である。
【図１０】第２実施形態に係るモバイル端末の概略構成を示す機能ブロック図である。
【図１１】ＡＰＩ対応表の一例を示す図である。
【図１２】第３実施形態に係るモバイル端末の概略構成を示す機能ブロック図である。
【図１３】第３実施形態における情報処理の一例を示すフローチャートである。
【図１４】第４実施形態に係るモバイル端末の概略構成を示す機能ブロック図である。
【図１５】第４実施形態における情報処理の一例を示すフローチャートである。
【図１６】第５実施形態に係るモバイル端末の概略構成を示す機能ブロック図である。
【図１７】第５実施形態における情報処理の一例を示すフローチャートである。
【発明を実施するための形態】
【００１４】
以下、図面を参照して開示の技術の実施形態の一例を詳細に説明する。
【００１５】
＜第１実施形態＞
図１に示すように、第１実施形態に係る情報処理システム１０は、モバイル端末２０と、周辺デバイス５０と、デバイスドライバ配信サーバ５２と、アプリケーション（以下、「アプリケーション」を「アプリ」と略する場合もある）配信サーバ５４とを含む。
【００１６】
モバイル端末２０は、例えば、スマートフォンやタブレット端末等の情報処理装置である。モバイル端末２０上では、周辺デバイス５０を利用するアプリが動作する。また、詳細は後述するが、本実施形態では、この周辺デバイス５０を利用するアプリが、ウェブ技術とネイティブ言語との両方を使用するハイブリッドアプリである場合について説明する。
【００１７】
周辺デバイス５０は、例えば、プリンタ、カードリーダ、各種センサ等の機器である。周辺デバイス５０とモバイル端末２０とは、無線通信又は有線通信により接続される。例えば、周辺デバイス５０とモバイル端末２０とは、Ｂｌｕｅｔｏｏｔｈ（登録商標）や無線ＬＡＮ（Local Area Network）を利用して通信する。
【００１８】
デバイスドライバ配信サーバ５２は、一般的なサーバ装置等の情報処理装置であり、内部に設けられた記憶装置又は外部接続された記憶装置に、複数のデバイスドライバを記憶している。デバイスドライバ配信サーバ５２は、モバイル端末２０からの要求に応じて、デバイスドライバをモバイル端末２０に配信する。
【００１９】
アプリ配信サーバ５４は、一般的なサーバ装置等の情報処理装置であり、内部に設けられた記憶装置又は外部接続された記憶装置に、複数のアプリプログラムを記憶している。アプリ配信サーバ５４は、モバイル端末２０からの要求に応じて、アプリプログラムをモバイル端末２０に配信する。
【００２０】
デバイスドライバ配信サーバ５２及びアプリ配信サーバ５４の各々とモバイル端末２０とは、無線通信又は有線通信により接続される。例えば、デバイスドライバ配信サーバ５２及びアプリ配信サーバ５４の各々とモバイル端末２０とは、無線ＬＡＮ、又は３ＧやＬＴＥ（Long Term Evolution）などのモバイルネットワークを利用して通信する。
【００２１】
図２に、モバイル端末２０の概略構成を示す。モバイル端末２０は、機能的には、アプリ受信部３１と、アプリ起動部３３と、デバイス検出部３５と、ドライバ取得部３６と、デバイス情報交換部３８とを含む。また、モバイル端末２０は、ロード部２１と、アクセス部２２を含む連携部３４と、通信部３９と、ＵＩ（User Interface）制御部４０とを含む。さらに、モバイル端末２０の所定の記憶領域には、アプリ記憶部３２と、ドライバ記憶部３７と、ＡＰＩ（Application Programming Interface）テーブル２５とが設けられる。以下、モバイル端末２０の各機能部について説明する。
【００２２】
通信部３９は、モバイル端末２０と周辺デバイス５０との間の通信、並びにモバイル端末２０とデバイスドライバ配信サーバ５２及びアプリ配信サーバ５４の各々との間の通信を制御する。
【００２３】
ＵＩ制御部４０は、ユーザへの情報提示手段及びユーザからの情報入力手段を提供するＵＩを制御する。具体的には、ＵＩ制御部４０は、アプリの起動を指示するためアイコンの表示、周辺デバイス５０へのアクセス要求や制御命令の受け付け、周辺デバイス５０から取得された情報に基づく画面表示等の制御を行う。
【００２４】
アプリ受信部３１は、通信部３９を介して、アプリ配信サーバ５４からアプリプログラムを受信し、アプリ記憶部３２へ記憶する。
【００２５】
アプリ起動部３３は、ＵＩ制御部４０を介して、ユーザから起動を指示されたアプリのアプリプログラムをアプリ記憶部３２から読み込み、アプリ４５を起動する。ユーザからの指示は、例えば、モバイル端末２０の表示部に表示されたアイコンをユーザがタッチするなどして行うことができる。
【００２６】
上述したように、本実施形態では、モバイル端末２０上で動作するアプリ４５としてハイブリッドアプリを使用する。ハイブリッドアプリは、ウェブ技術で記述されている部分とネイティブ言語で記述されている部分とから構成される。例えば、モバイル端末２０が、Ａｎｄｒｏｉｄ（登録商標）ＯＳ（Operating System）を搭載している場合には、ハイブリッドアプリは、ネイティブ言語として、Ｊａｖａ（登録商標）、さらにはＣ言語を利用することができる。また、ハイブリッドアプリは、ウェブ技術であるＨＴＭＬ（HyperText Markup Language）、ＪａｖａＳｃｒｉｐｔ（登録商標）、ＣＳＳ（Cascading Style Sheets）などを利用することができる。
【００２７】
また、ハイブリッドアプリにおいて、ウェブ技術で記述された部分と、ネイティブ言語で記述された部分との連携を実現する技術として、Ａｐａｃｈｅ  Ｃｏｒｄｏｖａというフレームワークが提供されている。Ａｐａｃｈｅ  Ｃｏｒｄｏｖａは、ＪａｖａＳｃｒｉｐｔ部分とＪａｖａ部分とからなるプラットフォームである。Ａｐａｃｈｅ  Ｃｏｒｄｏｖａを用いれば、アプリ開発者は、ウェブ技術部分を記述し、ネイティブ機能を提供するＣｏｒｄｏｖａプラグインのプラットフォーム部分をネイティブ部分として、合わせてビルドすることで、一つのアプリを作ることができる。
【００２８】
アプリ起動部３３により、周辺デバイス５０を利用するアプリ４５が起動された段階では、デバイスドライバは読み込まれておらず、モバイル端末２０上の実行環境は、アプリ４５とランタイムとから構成されている。なお、本実施形態において、ランタイムとは、入れ替えが想定されるアプリ４５やデバイスドライバ３０以外の部分であり、図２に示すモバイル端末２０の各機能部を含む。
【００２９】
アプリ起動部３３により起動されたアプリ４５は、ユーザ操作により指示された周辺デバイス５０へのアクセス要求を、デバイス検出部３５に出力する。なお、このアクセス要求には、どのような周辺デバイス５０にアクセスしたいかを指定する情報が含まれる。例えば、血圧を測定するアプリからのアクセス要求の場合、周辺デバイス５０のタイプ（種別）として、血圧計を指定する情報が含まれる。
【００３０】
また、アプリ起動部３３により起動されたアプリ４５は、ユーザによる操作又はアプリ４５の他のプロセスからの指示により、周辺デバイス５０に対する制御命令を、後述するＪａｖａＳｃｒｉｐｔ部分３０Ａに受け渡す。具体的には、アプリ４５は、制御命令に応じたＪａｖａＳｃｒｉｐｔ部分３０ＡのＡＰＩを呼び出す。また、アプリ４５は、ＡＰＩ呼び出しに対するＪａｖａＳｃｒｉｐｔ部分３０Ａからの応答を受け付け、受け付けた応答をＵＩ制御部４０へ受け渡す。
【００３１】
デバイス検出部３５は、周辺デバイス５０へのアクセス要求を受け付けると、通信部３９を介して、周辺デバイス５０を検出する。周辺デバイス５０の検出は、周辺デバイス５０との間での通信規格に従ったスキャン処理により実行することができる。例えば、デバイス検出部３５は、周辺デバイス５０との間の通信にＢｌｕｅｔｏｏｔｈ（登録商標）を利用する場合、Ｂｌｕｅｔｏｏｔｈの仕様に従ったスキャン処理を行う。また、デバイス検出部３５は、周辺デバイス５０との間の通信に無線ＬＡＮを利用する場合、例えば、ＵＰｎＰ（Universal Plug and Play）を使うなど、無線ＬＡＮの使用に従ったスキャン処理を行う。
【００３２】
より具体的には、例えば、モバイル端末２０と周辺デバイス５０との間の通信にＢＬＥ（Bluetooth Low Energy）を利用する場合、デバイス検出部３５は、周辺デバイス５０から定期的に送信されるａｄｖｅｒｔｉｓｉｎｇを受信する。ａｄｖｅｒｔｉｓｉｎｇには、そのａｄｖｅｒｔｉｓｉｎｇを送信した周辺デバイス５０のサービスＵＵＩＤ（Universally Unique Identifier）及びデバイスＩＤが含まれる。サービスＵＵＩＤは、周辺デバイス５０のタイプの識別情報である。デバイスＩＤは、デバイスベンダーが独自に設定した周辺デバイス５０の識別情報である。
【００３３】
デバイス検出部３５は、例えば、図３に示すような、周辺デバイス５０のタイプとサービスＵＵＩＤとの対応表を保持しておき、周辺デバイス５０の検出時に参照する。そして、デバイス検出部３５は、アプリ４５からのアクセス要求に含まれる周辺デバイス５０のタイプに対応するサービスＵＵＩＤを含むａｄｖｅｒｔｉｓｉｎｇを送信した周辺デバイス５０を検出する。デバイス検出部３５は、検出した周辺デバイス５０が送信したａｄｖｅｒｔｉｓｉｎｇに含まれるサービスＵＵＩＤ及びデバイスＩＤを、ドライバ取得部３６に通知する。
【００３４】
ドライバ取得部３６は、デバイス検出部３５から通知された情報が示す周辺デバイス５０をアプリ４５で利用するために必要なデバイスドライバを、通信部３９を介して、デバイスドライバ配信サーバ５２へ要求して、ダウンロードする。例えば、ドライバ取得部３６は、図４に示すような、サービスＵＵＩＤ及びデバイスＩＤと、そのサービスＵＵＩＤ及びデバイスＩＤで特定される周辺デバイス５０のデバイスドライバの取得先を示すＵＲＬとの対応表を保持しておく。そして、ドライバ取得部３６は、デバイス検出部３５から通知されたサービスＵＵＩＤ及びデバイスＩＤに対応するＵＲＬを対応表から取得し、デバイスドライバ配信サーバ５２へアクセスして、該当のデバイスドライバをダウンロードする。
【００３５】
本実施形態では、デバイスドライバは、ウェブ技術で記述されたモジュール（第１モジュール）と、ネイティブ言語で記述されたモジュール（第２モジュール）とを含む。以下では、図５に示すように、第１モジュールとして、ＪａｖａＳｃｒｉｐｔ部分３０Ａ、第２モジュールとして、Ｊａｖａ部分３０Ｂを含むデバイスドライバ３０をダウンロードするものとして説明する。
【００３６】
なお、デバイスドライバ３０のダウンロードについては、ＪａｖａＳｃｒｉｐｔ部分３０ＡとＪａｖａ部分３０Ｂとを別々にダウンロードしてもよいし、一つに圧縮されたファイルをダウンロードしてもよい。また、デバイスドライバ３０をダウンロードする前に、デバイスドライバ３０の情報が書かれた情報ファイルをダウンロードしてもよい。例えば、図４に示す対応表から取得したＵＲＬにアクセスすることにより、以下に示すような情報ファイルをダウンロードするとする。
【００３７】
{"java_driver":"driver.jar","java_driver_class":"com.fujitsu.jp.driver.BloodPressure",
"js_driver":"driver.js"}
【００３８】
この情報ファイルにより、デバイスドライバ３０には、Ｊａｖａ部分３０Ｂであるｄｒｉｖｅｒ．ｊａｒファイルと、ＪａｖａＳｃｒｉｐｔ部分３０Ａであるｄｒｉｖｅｒ．ｊｓファイルが存在することが分かる。なお、上記の例の情報ファイルには、Ｊａｖａ部分３０Ｂに定義されているクラス名が含まれている。このクラス名は後段の処理で使用するために、情報ファイルに記述されているものであり、詳細は後述する。ドライバ取得部３６は、この情報ファイルと、この情報ファイルをダウンロードしたＵＲＬとに基づいて、Ｊａｖａ部分３０Ｂのファイル及びＪａｖａＳｃｒｉｐｔ部分３０ＡのファイルをダウンロードするためのＵＲＬを作成する。ドライバ取得部３６は、例えば、図４に示す対応表のサービスＵＵＩＤ＝０ｘ１８１０、及びデバイスＩＤ＝０ｘ１２３４０００１に対応するデバイスドライバ３０について、上記のような情報ファイルを取得している場合には、以下のようなＵＲＬを作成する。
【００３９】
＜Ｊａｖａ部分３０Ｂ用のＵＲＬ＞
http://jp.fujitsu.com/driver/blood_pressure/driver.jar
＜ＪａｖａＳｃｒｉｐｔ部分３０Ａ用のＵＲＬ＞
http://jp.fujitsu.com/driver/blood_pressure/driver.js
【００４０】
ドライバ取得部３６は、作成したＵＲＬでデバイスドライバ配信サーバ５２にアクセスして、Ｊａｖａ部分３０Ｂのファイル及びＪａｖａＳｃｒｉｐｔ部分３０Ａのファイルをダウンロードする。ドライバ取得部３６は、ダウンロードしたデバイスドライバ３０を、ドライバ記憶部３７に記憶する。また、ドライバ取得部３６は、情報ファイルもダウンロードしている場合には、情報ファイルもドライバ記憶部３７に記憶する。
【００４１】
ロード部２１は、ドライバ記憶部３７に記憶されたデバイスドライバ３０のＪａｖａ部分３０Ｂをロードする。例えば、Ａｎｄｒｏｉｄ  ＯＳでは、Ｊａｖａのクラスファイルであるｊａｒファイルを読み込むＡＰＩが提供されている。ロード部２１は、そのＡＰＩを使って、Ｊａｖａ部分３０Ｂをロードすることができる。
【００４２】
ロードされたＪａｖａ部分３０Ｂは、後述するアクセス部２２により呼び出されたＡＰＩに対応するＪａｖａオブジェクトに従って、デバイス情報交換部３８へ、周辺デバイス５０を制御するための情報を通知する。この処理は、例えば、Ａｎｄｒｏｉｄ  ＯＳのＡＰＩを呼び出すことにより実行される。また、ロードされたＪａｖａ部分３０Ｂは、制御命令に対するデバイス情報交換部３８からの応答を受け付け、連携部３４へ返答する。
【００４３】
また、ロード部２１は、Ｊａｖａ部分３０Ｂをロードする際、Ｊａｖａ部分３０Ｂに定義されたＡＰＩを呼び出すために必要となる情報（以下、「ＡＰＩ情報」という）を取得して、ＡＰＩテーブル２５に記憶する。周辺デバイス５０を制御するためのＪａｖａオブジェクトにアクセスするためには、Ｊａｖａ部分３０Ｂに定義されたクラス内のメソッドにアクセスするＡＰＩを呼び出す必要がある。このＡＰＩを呼び出すためには、アクセスするクラス名及びメソッド名が必要である。そのため、本実施形態では、Ｊａｖａ部分３０Ｂに定義されたクラス名及びメソッド名を取得し、Ｊａｖａオブジェクトと対応付けて、ＡＰＩ情報として記憶する。
【００４４】
具体的には、ロード部２１は、ドライバ記憶部３７に記憶された情報ファイルから、Ｊａｖａ部分３０Ｂに定義されたクラス名を取得する。なお、クラス名の取得方法は、情報ファイルから取得する場合に限定されない。例えば、情報ファイルではなく、図５に示すデバイスドライバ３０のように、ＪａｖａＳｃｒｉｐｔ部分３０Ａに、Ｊａｖａ部分３０Ｂに定義されたクラス名を記述しておき、ＪａｖａＳｃｒｉｐｔ部分３０Ａからロード部２１にクラス名を通知してもよい。その場合は、情報ファイルへのクラス名の記述は不要である。なお、図５の例では、”ｄｒｉｖｅｒ．ｊａｒ”というファイルのＪａｖａ部分３０Ｂに、”ｈｔｔｐ：／／ｊｐ．ｆｕｊｉｔｓｕ．ｃｏｍ／ｄｒｉｖｅｒ／ｂｌｏｏｄ＿ｐｒｅｓｓｕｒｅ”というクラス名が定義されていることを表す。
【００４５】
ロード部２１は、取得したクラス名を用いて、デバイスドライバ３０のＪａｖａ部分３０Ｂのクラスにアクセスし、クラスに定義されたメソッド名を取得する。そして、取得したクラス名及びメソッド名を、例えば、図６に示すようなＡＰＩテーブル２５に記憶する。クラス及びメソッドは、Ｊａｖａのオブジェクトとしてメモリ上に保存されており、そのオブジェクトにアクセスすることで情報を取得できる。したがって、図６のＡＰＩテーブル２５に示すように、クラス名及びメソッド名に、対応するＪａｖａオブジェクトを対応付けて、ＡＰＩ情報として記憶しておく。
【００４６】
また、ロード部２１は、ドライバ記憶部３７に記憶されたデバイスドライバ３０のＪａｖａＳｃｒｉｐｔ部分３０Ａをインポートする。ＪａｖａＳｃｒｉｐｔには、文字列をＪａｖａＳｃｒｉｐｔで記述されたプログラムとして実行することができるＡＰＩが標準で提供されている。ロード部２１は、そのＡＰＩを呼び出すことで、ＪａｖａＳｃｒｉｐｔ部分３０Ａをインポートする。
【００４７】
インポートされたＪａｖａＳｃｒｉｐｔ部分３０Ａは、アプリ４５からの制御命令に応じたＡＰＩが呼び出されると、制御命令に応じたクラス名、メソッド名、引数、及びコールバック関数の情報を、汎用ＡＰＩに変換する。そして、ＪａｖａＳｃｒｉｐｔ部分３０Ａは、汎用ＡＰＩを連携部３４を介してアクセス部２２へ受け渡す。汎用ＡＰＩは、ウェブ技術であるＪａｖａＳｃｒｉｐｔ部分３０Ａから、ランタイムの一部である連携部３４を呼び出すことができるＡＰＩである。以下に、汎用ＡＰＩに変換された情報の一例を示す。
【００４８】
this.device.callNative("com.fujitsu.jp.driver.BloodPressure", "GetSystolic", params, function(info){alert('callNative ok‘: + info);}, function() {alert('callNative not ok');});
【００４９】
上記の例では、ｃａｌｌＮａｔｉｖｅが、ウェブ技術であるＪａｖａＳｃｒｉｐｔ部分３０Ａとランタイムとの共通のインターフェースである。”ｃｏｍ．ｆｕｊｉｔｓｕ．ｊｐ．ｄｒｉｖｅｒ．ＢｌｏｏｄＰｒｅｓｓｕｒｅ”はクラス名、”ＧｅｔＳｙｓｔｏｌｉｃ”はメソッド名、ｐａｒａｍｓは引数である。また、ｆｕｎｃｔｉｏｎ（ｉｎｆｏ）及びｆｕｎｃｔｉｏｎ（）はコールバック関数である。すなわち、汎用ＡＰＩでは、ＪａｖａＳｃｒｉｐｔ部分３０Ａでアプリ４５から呼び出されたＡＰＩが、共通のインターフェースを示す関数の引数となる。これにより、連携部３４は、アプリ４５から受け渡されるメソッド毎にＡＰＩを用意する必要がなく、共通のインターフェースに対応したＡＰＩを用意しておくだけで、アプリ４５から受け渡される様々な制御命令（メソッド）に対応することができる。
【００５０】
また、インポートされたＪａｖａＳｃｒｉｐｔ部分３０Ａは、連携部３４から、汎用ＡＰＩに対する応答として、周辺デバイス５０からの応答を受け付ける。そして、ＪａｖａＳｃｒｉｐｔ部分３０Ａは、受け付けた応答を、ＪａｖａＳｃｒｉｐｔ部分３０ＡのＡＰＩを呼び出したアプリ４５に返答する。
【００５１】
連携部３４は、ハイブリッドアプリにおいて、ウェブ技術で記述された部分と、ネイティブ言語で記述された部分との連携を実現する機能であり、例えば、上述のＡｐａｃｈｅ  Ｃｏｒｄｏｖａを適用することができる。連携部３４は、ＪａｖａＳｃｒｉｐｔ部分３０Ａから汎用ＡＰＩを受け取ると、汎用ＡＰＩをアクセス部２２に受け渡す。また、連携部３４は、Ｊａｖａ部分３０Ｂから応答を受け取ると、汎用ＡＰＩに含まれるコールバック関数の引数として、受け取った応答をＪａｖａＳｃｒｉｐｔ部分３０Ａへ返す。
【００５２】
アクセス部２２は、連携部３４のプラグインとして機能する。アクセス部２２は、連携部３４を介して、ＪａｖａＳｃｒｉｐｔ部分３０Ａから汎用ＡＰＩを受け取る。アクセス部２２は、汎用ＡＰＩに含まれるクラス名及びメソッド名を抽出し、ＡＰＩテーブル２５を参照して、対応するＪａｖａオブジェクトを取得する。そして、アクセス部２２は、取得したＪａｖａオブジェクトに対応するＪａｖａ部分３０ＢのＡＰＩを呼び出す。
【００５３】
デバイス情報交換部３８は、Ｊａｖａ部分３０Ｂから通知された情報に従って、通信部３９を介して、周辺デバイス５０にアクセスし、周辺デバイス５０との間で、情報のやり取りを行う。デバイス情報交換部３８は、周辺デバイス５０から取得した情報を、Ｊａｖａ部分３０Ｂへ応答する。
【００５４】
モバイル端末２０は、例えば図７に示すコンピュータ６０で実現することができる。コンピュータ６０は、ＣＰＵ６１、一時記憶領域としてのメモリ６２、及び不揮発性の記憶部６３を備える。また、コンピュータ６０は、入出力装置６４と、記録媒体６９に対するデータの読み込み及び書き込みを制御するｒｅａｄ／ｗｒｉｔｅ（Ｒ／Ｗ）部６５と、インターネット等のネットワークに接続されるネットワークＩ／Ｆ６６とを備える。ＣＰＵ６１、メモリ６２、記憶部６３、入出力装置６４、Ｒ／Ｗ部６５、及びネットワークＩ／Ｆ６６は、バス６７を介して互いに接続される。
【００５５】
記憶部６３は、ＨＤＤ（Hard Disk Drive）、ＳＳＤ（solid state drive）、フラッシュメモリ等によって実現できる。記憶媒体としての記憶部６３には、コンピュータ６０をモバイル端末２０として機能させるための情報処理プログラム７０が記憶される。また、記憶部６３は、ＡＰＩテーブル２５を構成するＡＰＩ情報が記憶されるＡＰＩ情報記憶領域７５と、アプリ記憶部３２及びドライバ記憶部３７として機能するデータ記憶領域８１とを有する。また、図示は省略するが、記憶部６３には、ＯＳなどのプログラムも記憶されている。
【００５６】
ＣＰＵ６１は、情報処理プログラム７０を記憶部６３から読み出してメモリ６２に展開し、情報処理プログラム７０が有するプロセスを順次実行する。また、ＣＰＵ６１は、ＡＰＩ情報記憶領域７５に記憶されたＡＰＩ情報を、ＡＰＩテーブル２５としてメモリ６２に展開する。
【００５７】
情報処理プログラム７０は、ロードプロセス７１と、アクセスプロセス７２と、情報処理プロセス８０とを有する。ＣＰＵ６１は、ロードプロセス７１を実行することで、図２に示すロード部２１として動作する。また、ＣＰＵ６１は、アクセスプロセス７２を実行することで、図２に示すアクセス部２２として動作する。また、ＣＰＵ６１は、情報処理プロセス８０を実行することで、図２に示すアプリ受信部３１、アプリ起動部３３、デバイス検出部３５、ドライバ取得部３６、デバイス情報交換部３８、通信部３９、及びＵＩ制御部４０の各々として動作する。これにより、情報処理プログラム７０を実行したコンピュータ６０が、モバイル端末２０として機能することになる。
【００５８】
次に、第１実施形態に係る情報処理システム１０の作用について説明する。アプリ記憶部３２に、周辺デバイス５０を利用するアプリのアプリプログラムが記憶されているものとする。ユーザにより、周辺デバイス５０を利用するアプリの起動が指示されると、モバイル端末２０において、図８に示す情報処理ルーチンが実行される。
【００５９】
ステップＳ１１で、アプリ起動部３３が、ユーザから起動を指示されたアプリのアプリプログラムをアプリ記憶部３２から読み込んで、アプリ４５を起動する。
【００６０】
次に、ステップＳ１２で、アプリ起動部３３により起動されたアプリ４５が、アプリ４５で利用する周辺デバイス５０へのアクセス要求を受け付けたか否かを判定する。アクセス要求を受け付けていない場合には、受け付けるまで本ステップの判定を繰り返し、受け付けた場合には、処理はステップＳ１３へ移行する。
【００６１】
ステップＳ１３では、アプリ４５が、周辺デバイス５０のタイプを指定したアクセス要求をデバイス検出部３５に出力する。そして、デバイス検出部３５が、通信部３９を介して、スキャン処理により周辺デバイス５０を検出する。この際、デバイス検出部３５は、周辺デバイス５０のサービスＵＵＩＤ及びデバイスＩＤを取得し、ドライバ取得部３６に通知する。
【００６２】
次に、ステップＳ１４で、ドライバ取得部３６が、図４に示すような対応表を参照して、デバイス検出部３５から通知されたサービスＵＵＩＤ及びデバイスＩＤに対応するＵＲＬを取得する。そして、ドライバ取得部３６は、取得したＵＲＬを用いてデバイスドライバ配信サーバ５２へアクセスして、ＪａｖａＳｃｒｉｐｔ部分３０Ａ及びＪａｖａ部分３０Ｂを含むデバイスドライバ３０をダウンロードする。
【００６３】
次に、ステップＳ１５で、ロード部２１が、デバイスドライバ３０のＪａｖａ部分３０Ｂをロードする。また、ロード部２１は、Ｊａｖａ部分３０Ｂをロードする際、Ｊａｖａ部分３０Ｂに定義されたクラス名及びメソッド名と、Ｊａｖａオブジェクトとを対応付けたＡＰＩ情報を取得して、例えば、図６に示すようなＡＰＩテーブル２５に記憶する。
【００６４】
次に、ステップＳ１６で、ロード部２１が、デバイスドライバ３０のＪａｖａＳｃｒｉｐｔ部分３０Ａをインポートする。
【００６５】
次に、ステップＳ１７で、アプリ４５が、周辺デバイス５０に対する制御命令を受け付けたか否かを判定する。制御命令を受け付けていない場合には、受け付けるまで本ステップの判定を繰り返し、受け付けた場合には、処理はステップＳ１８へ移行する。
【００６６】
ステップＳ１８では、アプリ４５が、制御命令に応じたＪａｖａＳｃｒｉｐｔ部分３０ＡのＡＰＩを呼び出す。次に、ステップＳ１９で、ＪａｖａＳｃｒｉｐｔ部分３０Ａが、制御命令に応じて呼び出されたＡＰＩを、制御命令に応じたクラス名、メソッド名、引数、及びコールバック関数の情報を含む汎用ＡＰＩに変換して、連携部３４を介してアクセス部２２へ受け渡す。
【００６７】
次に、ステップＳ２０で、アクセス部２２が、汎用ＡＰＩからクラス名及びメソッド名を抽出し、ＡＰＩテーブル２５を参照して、対応するＪａｖａオブジェクト名を取得する。そして、アクセス部２２は、取得したＪａｖａオブジェクト名が示すＪａｖａオブジェクトにアクセスするためのＪａｖａ部分３０ＢのＡＰＩを呼び出す。Ｊａｖａ部分３０Ｂは、呼び出されたＡＰＩに対応するＪａｖａオブジェクトに従って、デバイス情報交換部３８へ、周辺デバイス５０を制御するための情報を通知する。
【００６８】
次に、ステップＳ２１で、デバイス情報交換部３８が、Ｊａｖａ部分３０Ｂから通知された情報に従って、通信部３９を介して、周辺デバイス５０にアクセスし、周辺デバイス５０との間で、情報のやり取りを行う。次に、ステップＳ２２で、デバイス情報交換部３８が、周辺デバイス５０から取得した情報を、Ｊａｖａ部分３０Ｂで呼び出されたＡＰＩに対して返答する。
【００６９】
次に、ステップＳ２３で、Ｊａｖａ部分３０Ｂが、デバイス情報交換部３８から返答された情報を、連携部３４へ受け渡す。連携部３４は、汎用ＡＰＩに含まれるコールバック関数の引数として、受け取った応答をＪａｖａＳｃｒｉｐｔ部分３０Ａへ返す。
【００７０】
次に、ステップＳ２４で、ＪａｖａＳｃｒｉｐｔ部分３０Ａが、受け付けた応答を、ＪａｖａＳｃｒｉｐｔ部分３０ＡのＡＰＩを呼び出したアプリ４５に返答する。次に、ステップＳ２５で、アプリ４５が、受け付けた応答をＵＩ制御部４０に受け渡し、ＵＩ制御部４０が、応答に応じた情報表示が行われるようにＵＩを制御して、情報処理ルーチンは終了する。
【００７１】
上記の情報処理ルーチンの流れを、図９に概略的に示す。アプリ４５からアクセス要求された周辺デバイス５０のデバイスドライバ３０がダウンロードされると、ロード部２１が、デバイスドライバ３０のＪａｖａ部分３０Ｂをロードする（図９中の（１））。その際、ロード部２１は、Ｊａｖａ部分３０ＢからＡＰＩ情報を取得して、ＡＰＩテーブル２５に記憶する（図９中の（２））。また、ロード部２１は、デバイスドライバ３０のＪａｖａＳｃｒｉｐｔ部分３０Ａをインポートする（図９中の（３））。
【００７２】
そして、アプリ４５から周辺デバイス５０に対する制御命令が出されると、制御命令に応じたＪａｖａＳｃｒｉｐｔ部分３０ＡのＡＰＩが呼び出される（図９中の（４））。呼び出されたＡＰＩは、汎用ＡＰＩに変換されて、アクセス部２２に受け渡される（図９中の（５））。アクセス部２２は、汎用ＡＰＩとＡＰＩテーブル２５のＡＰＩ情報とに基づいて、Ｊａｖａ部分３０ＢのＡＰＩを呼び出す（図９中の（６））。そして、Ｊａｖａ部分３０Ｂが周辺デバイス５０を制御する（図９中の（７））。
【００７３】
なお、不要となったデバイスドライバ（ＪａｖａＳｃｒｉｐｔ部分３０Ａ及びＪａｖａ部分３０Ｂ）は、その都度アンロードしてもよい。例えば、ＪａｖａＳｃｒｉｐｔ部分３０Ａから要求されたタイミングで、Ｊａｖａ部分３０Ｂをアンロードすることができる。また、アプリ終了時などのタイミングで、ＪａｖａＳｃｒｉｐｔ部分３０Ａをアンロードし、ＪａｖａＳｃｒｉｐｔ部分３０Ａがアンロードされたタイミングで、Ｊａｖａ部分３０Ｂもアンロードするようにしてもよい。
【００７４】
Ｊａｖａ部分３０Ｂのアンロードは、ロードされたＪａｖａ部分３０Ｂのクラスに対応するＪａｖａオブジェクトを開放することで実現できる。なお、アプリ４５又はＪａｖａＳｃｒｉｐｔ部分３０ＡからＪａｖａ部分３０Ｂのアンロードを制御するために、ランタイムに、ＪａｖａＳｃｒｉｐｔ部分３０Ａから呼び出すことができる、アンロードのためのＡＰＩを用意しておく。
【００７５】
このように、ロードされているデバイスドライバ３０を適宜アンロードすることで、メモリなどの使用リソースを減らすことができ、また、ＪａｖａＳｃｒｉｐｔ部分３０ＡやＪａｖａ部分３０Ｂが不正に呼び出されることを防止することができる。
【００７６】
以上説明したように、第１実施形態に係る情報処理システム１０によれば、モバイル端末２０において、アプリ４５が周辺デバイス５０を利用する際に、その周辺デバイス５０のデバイスドライバ３０をダウンロードしてロードすればよい。また、デバイスドライバ３０は、ウェブ技術で記述された第１モジュール（ＪａｖａＳｃｒｉｐｔ部分３０Ａ）と、ネイティブ言語で記述された第２モジュール（Ｊａｖａ部分３０Ｂ）とを含むため、ハイブリッドアプリケーションに適用することができる。なお、第１モジュールと第２モジュールとの連携は、第２モジュールから取得したＡＰＩ情報と、第１モジュールで呼び出されたＡＰＩとを対応付けることで実現できる。すなわち、ハイブリッドアプリケーションで周辺デバイスを利用するためのデバイスドライバを動的に入れ替えることができる。また、デバイスドライバの動的な入れ替えが可能になることにより、アプリを更新することなく様々なデバイスにアクセスできるようになる。
【００７７】
また、デバイスドライバには、複雑なプログラムが記述されることがある。また、ネイティブアプリ用のデバイスドライバは、通常ネイティブ言語で記述される。このため、ネイティブアプリ用のデバイスドライバを流用して、ハイブリッドアプリ用のデバイスドライバを作成するのは大変手間である。例えば、カメラデバイスと連携して、写真を撮るだけであれば、撮影のＡＰＩを呼び出すだけの単純なプログラムをデバイスドライバとして記述すればよい。しかし、撮影した写真から文字列を認識して取得（ＯＣＲ機能）するためのプログラムをドライバとして提供する場合は、複雑なプログラムを記述する必要があり、ネイティブアプリ用のデバイスドライバからの流用が困難である。
【００７８】
しかし、本実施形態のように、ウェブ技術で記述された第１モジュールと、ネイティブ言語で記述された第２モジュールとを含むデバイスドライバであれば、ネイティブアプリ用のデバイスドライバからの流用が容易となる。
【００７９】
また、従来技術のように、ネイティブ側のデバイスドライバを汎用デバイスドライバとした場合には、汎用デバイスドライバの置き換えができないため、ウェブ技術のデバイスドライバに記述される内容が多くなってしまう。例えば、加速度センサの値に基づいて検出された人の動作に関する情報をアプリで利用する場合を考える。ネイティブ側が汎用デバイスドライバの場合、汎用デバイスドライバでアプリに応じた処理を行うことができないため、加速度センサから取得したセンサ値をそのままウェブ技術側のデバイスドライバに渡すことになる。そして、ウェブ技術側のデバイスドライバで、センサ値を解析して人の動作を判定し、判定結果をアプリに返す、といったデバイスドライバが作成されることが想定される。
【００８０】
しかし、ウェブ技術であるスクリプト言語で記述されたプログラムは、動作が遅い。特に、ＪａｖａＳｃｒｉｐｔは、最適なＪＩＴ（Just in Time）コンパイルが難しいことから、様々な高速化手法が開発されているものの、ＪａｖａやＣ言語をコンパイルした場合に比べて動作が遅い。したがって、ＪａｖａＳｃｒｉｐｔでの処理が多い場合には、ＪａｖａやＣ言語での処理が多い場合に比べ、デバイスドライバ全体での処理時間が長くなってしまう。また、ウェブ技術とネイティブ言語間の通信にも時間がかかる。そのため、取得されたセンサ値の全てをネイティブ言語からウェブ技術に渡す場合は、センサ値を解析して判定した判定結果のみを渡す場合に比べ、その通信にかかる時間も多くなってしまう。
【００８１】
一方、本実施形態の場合には、デバイスドライバ３０を入れ替えることが可能であるため、使用する周辺デバイス５０に応じて、Ｊａｖａ部分で多くの処理を担うデバイスドライバを使用することが可能である。したがって、デバイスドライバの処理速度を高速化することができる。
【００８２】
なお、第１実施形態では、まず、Ｊａｖａ部分をロードしてから、ＪａｖａＳｃｒｉｐｔ部分をインポートする場合について説明したが、これに限定されない。
【００８３】
例えば、図５に示すデバイスドライバ３０のように、ＪａｖａＳｃｒｉｐｔ部分３０ＡにＪａｖａ部分３０Ｂを呼び出すプログラムを記述しておき、まず、このＪａｖａＳｃｒｉｐｔ部分３０Ａを先にインポートする。そして、ＪａｖａＳｃｒｉｐｔ部分３０Ａからの要求により、Ｊａｖａ部分３０Ｂをロードするようにしてもよい。また、ＪａｖａＳｃｒｉｐｔ部分３０Ａを先にインポートしておき、アクセス部２２からＪａｖａ部分３０ＢのＡＰＩ呼び出しが行われたことをトリガとして、Ｊａｖａ部分３０Ｂをロードするようにしてもよい。このようにすることで、Ｊａｖａ部分３０Ｂが不要にロードされることを防ぐことができる。
【００８４】
＜第２実施形態＞
次に、第２実施形態について説明する。なお、第２実施形態に係る情報処理システムについて、第１実施形態に係る情報処理システム１０と同様の部分については、同一符号を付して、詳細な説明を省略する。
【００８５】
図１に示すように、第２実施形態に係る情報処理システム２１０は、モバイル端末２２０と、周辺デバイス５０と、デバイスドライバ配信サーバ５２と、アプリ配信サーバ５４とを含む。
【００８６】
図１０に、モバイル端末２２０の概略構成を示す。モバイル端末２２０は、第１実施形態に係るモバイル端末２０の各機能部に加え、生成部２３を含み、また、第１実施形態に係るモバイル端末２０のロード部２１に替えて、ロード部２２１を含む。
【００８７】
ロード部２２１は、ドライバ記憶部３７に記憶されたＪａｖａＳｃｒｉｐｔ部分３０Ａではなく、後述する生成部２３で生成されたＪａｖａＳｃｒｉｐｔ部分３０Ａをインポートする点が、第1実施形態におけるロード部２１と異なる。
【００８８】
上述したように、スクリプト言語よりもネイティブ言語で記述されたプログラムの方が動作が速いため、ＪａｖａＳｃｒｉｐｔ部分３０Ａの記述量はできるだけ少ない方が良い。例えば、ＪａｖａＳｃｒｉｐｔ部分３０Ａは、Ｊａｖａ部分３０Ｂを呼び出すためのシンプルな変換処理が記述されていれば十分である。そこで、第２実施形態では、生成部２３により、シンプルな変換処理を記述したＪａｖａＳｃｒｉｐｔ部分３０Ａを生成する。
【００８９】
具体的には、生成部２３は、ＡＰＩテーブル２５に記憶されているＡＰＩ情報のメソッド名を、アプリ４５から呼び出されるＪａｖａＳｃｒｉｐｔ部分３０ＡのＡＰＩとするＪａｖａＳｃｒｉｐｔ部分３０Ａを生成する。また、ＡＰＩ情報のメソッド名、すなわち、Ｊａｖａ部分３０Ｂで呼び出されるＡＰＩに引数がある場合には、ＪａｖａＳｃｒｉｐｔ部分３０ＡのＡＰＩにも引数の情報を追加する。この引数のように、ＪａｖａＳｃｒｉｐｔ部分３０Ａの生成に必要となる情報は、ＡＰＩ情報をＡＰＩテーブル２５に記憶する際に、あわせて記憶しておく。
【００９０】
例えば、生成部２３は、下記に示すように、Ｊａｖａ部分３０ＢからＪａｖａＳｃｒｉｐｔ部分３０Ａを生成することができる。
【００９１】
＜Ｊａｖａ部分３０Ｂ＞
Class SensorNativeDriver {
static public void func1(int value1) {…}
}
＜生成したＪａｖａＳｃｒｉｐｔ部分３０Ａ＞
function func1(value1) {
this.device.callNative("com.fjl.nativedriver.dex/SensorNativeDriver", "func1", [value1], function(){}, function() {});
}
【００９２】
なお、ＪａｖａＳｃｒｉｐｔ部分３０Ａからアクセス可能なＪａｖａ部分３０Ｂのメソッドを限定するために、Ｊａｖａ部分３０Ｂにおけるメソッドの定義部分に、アノテーションを付与しておいてもよい。例えば、ＪａｖａＳｃｒｉｐｔ部分３０Ａからアクセス可能なＪａｖａ部分３０Ｂのメソッドに、以下に示すように、アノテーション（以下の例では「＠ＪＳＭｅｔｈｏｄ」）を付与しておく。
【００９３】
@JSMethod
public void getSystolic (JSONObject json, JavaDriverListener driverListener) {
}
【００９４】
生成部２３は、アノテーションが付与されているメソッドを、ＪａｖａＳｃｒｉｐｔ部分３０Ａからアクセス可能なメソッドであると判断し、そのメソッドを呼び出すためのＡＰＩをＪａｖａＳｃｒｉｐｔ部分３０Ａに記述する。この場合、ロード部２２１がＡＰＩ情報をＡＰＩテーブル２５に記憶する際に、アノテーションが付与されているメソッドについては、アノテーションも共にＡＰＩテーブル２５に記憶する。生成部２３は、ＡＰＩテーブル２５において、アノテーションが付与されているＡＰＩ情報に基づいて、ＪａｖａＳｃｒｉｐｔ部分３０Ａを生成すればよい。
【００９５】
モバイル端末２２０は、例えば図７に示すコンピュータ６０で実現することができる。コンピュータ６０の記憶部６３には、コンピュータ６０をモバイル端末２２０として機能させるための情報処理プログラム２７０が記憶される。ＣＰＵ６１は、情報処理プログラム２７０を記憶部６３から読み出してメモリ６２に展開し、情報処理プログラム２７０が有するプロセスを順次実行する。情報処理プログラム２７０は、ロードプロセス２７１と、アクセスプロセス７２と、生成プロセスと７３と、情報処理プロセス８０とを有する。
【００９６】
ＣＰＵ６１は、ロードプロセス２７１を実行することで、図１０に示すロード部２２１として動作する。また、ＣＰＵ６１は、生成プロセス７３を実行することで、図１０に示す生成部２３として動作する。他のプロセスについては、第１実施形態における情報処理プログラム７０と同様である。これにより、情報処理プログラム２７０を実行したコンピュータ６０が、モバイル端末２２０として機能することになる。
【００９７】
次に、第２実施形態に係る情報処理システム２１０の作用について、第１実施形態と異なる点について説明する。
【００９８】
図８に示す情報処理ルーチンのステップＳ１６の前に、生成部２３が、ＡＰＩテーブル２５を参照して、ＪａｖａＳｃｒｉｐｔ部分３０Ａを生成する。そして、ステップＳ１６において、ロード部２２１が、ドライバ記憶部３７に記憶されているデバイスドライバ３０ではなく、生成部２３が生成したＪａｖａＳｃｒｉｐｔ部分３０Ａをインポートする。
【００９９】
後段の処理は、Ｊａｖａ部分３０Ｂから生成されたＪａｖａＳｃｒｉｐｔ部分３０Ａであっても、Ｊａｖａ部分３０Ｂと共にダウンロードされたＪａｖａＳｃｒｉｐｔ部分３０Ａであっても同様であるため、説明を省略する。
【０１００】
以上説明したように、第２実施形態に係る情報処理システム２１０によれば、ネイティブ言語で記述された第２モジュールに基づいて、ウェブ技術の第１モジュールを自動で生成する。このため、デバイスドライバとして第２モジュールのみを用意しておけばよいため、デバイスドライバの開発を効率化することができる。
【０１０１】
なお、第２実施形態において生成したＪａｖａＳｃｒｉｐｔ部分３０Ａを記憶しておき、再度同じＪａｖａ部分３０Ｂがロードされた場合に、記憶しておいたＪａｖａＳｃｒｉｐｔ部分３０Ａをインポートするようにしてもよい。この場合、ＪａｖａＳｃｒｉｐｔ部分３０Ａを生成する際に利用したＪａｖａ部分３０Ｂのクラス名を、生成したＪａｖａＳｃｒｉｐｔ部分３０Ａに対応付けえて記憶しておく。そして、ロードされたＪａｖａ部分３０Ｂに定義されたクラス名に対応するＪａｖａＳｃｒｉｐｔ部分３０Ａを、記憶されているＪａｖａＳｃｒｉｐｔ部分３０Ａから検索して使用するとよい。これにより、同じデバイスドライバ３０のＪａｖａ部分３０Ｂがロードされる場合に、ＪａｖａＳｃｒｉｐｔ部分３０Ａを改めて生成する必要がないため、ＪａｖａＳｃｒｉｐｔ部分３０Ａのインポートを高速化することができる。
【０１０２】
また、Ｊａｖａ部分３０Ｂがバージョンアップされる場合もあるため、これに対応するため、例えば、以下に示すように、Ｊａｖａ部分３０Ｂのクラス名と、そのクラスのバージョン情報も合わせて用いるとよい。
【０１０３】
{ "java_driver": "driver.jar", "java_driver_class": "com.fujitsu.jp.driver.BloodPressure",
"version": "1.01"}
【０１０４】
さらに、異なるデバイスドライバ３０のＪａｖａ部分３０Ｂに定義されたＡＰＩが、同様の機能を持つ場合、これらのＡＰＩの違いを吸収する方法を実装してもよい。例えば、周辺デバイス５０のタイプが同じ血圧計であっても、デバイスベンダーが異なる場合、それぞれ異なるデバイスドライバ３０が作成される。この場合、デバイスドライバ３０に含まれるＪａｖａ部分３０Ｂのメソッドもそれぞれ異なる形で定義されている場合がある。そこで、例えば、図１１に示すようなＡＰＩ対応表を作成しておく。
【０１０５】
このＡＰＩ対応表の例は、サービスＵＵＩＤ＝０ｘ１８１０で示される周辺デバイス５０について、デバイスＩＤ＝０ｘ１２３４０００１及び０ｘ２３４５１２３４の各々に対応するデバイスドライバのＡＰＩの対応を示している。より具体的には、デバイスＩＤ＝０ｘ１２３４０００１のＪａｖａ部分３０Ｂのメソッド「ｇｅｔＳｙｓｔｏｌｉｃ」にアクセスするＪａｖａＳｃｒｉｐｔ部分３０ＡのＡＰＩはＡＰＩ１であることを示している。また、デバイスＩＤ＝０ｘ２３４５１２３４のＪａｖａ部分３０Ｂでは、メソッド「ｇｅｔＢｌｏｏｄＰｒｅｓｓｕｒｅＳｙｓｔｏｌｉｃ」が上記の「ｇｅｔＳｙｓｔｏｌｉｃ」と同等の機能であるとする。この場合、デバイスＩＤ＝０ｘ１２３４０００１の「ｇｅｔＳｙｓｔｏｌｉｃ」と同様に、「ｇｅｔＢｌｏｏｄＰｒｅｓｓｕｒｅＳｙｓｔｏｌｉｃ」を、ＪａｖａＳｃｒｉｐｔ部分３０ＡのＡＰＩ１に対応付けておく。この情報により、デバイスＩＤ＝０ｘ１２３４０００１の場合も、デバイスＩＤ＝０ｘ２３４５１２３４の場合も、同じＡＰＩ１により、Ｊａｖａ部分３０Ｂの同等のメソッドを呼び出せるように、ＪａｖａＳｃｒｉｐｔ部分３０Ａを生成することができる。例えば、デバイスＩＤ＝０ｘ２３４５１２３４のＪａｖａ部分３０Ｂがロードされた場合、生成部２３は、以下のようにＪａｖａＳｃｒｉｐｔ部分３０Ａを生成することができる。
【０１０６】
function getSystolic(success, failure, unit) {
cordova.exec(success, failure, "JavaDriver", "call_java", ["getBloodPressureSystolic", unit]);
}
【０１０７】
これにより、異なるＡＰＩを持つＪａｖａ部分３０Ｂであっても、アプリ４５からは同じＡＰＩでアクセスできるように、Ｊａｖａ部分３０Ｂで定義されたメソッドの違いを吸収するＪａｖａＳｃｒｉｐｔ部分３０Ａを生成することができる。
【０１０８】
＜第３実施形態＞
次に、第３実施形態について説明する。なお、第３実施形態に係る情報処理システムについて、第１実施形態に係る情報処理システム１０と同様の部分については、同一符号を付して、詳細な説明を省略する。
【０１０９】
図１に示すように、第３実施形態に係る情報処理システム３１０は、モバイル端末３２０と、周辺デバイス５０と、デバイスドライバ配信サーバ５２と、アプリ配信サーバ５４とを含む。
【０１１０】
図１２に、モバイル端末３２０の概略構成を示す。モバイル端末３２０は、第１実施形態に係るモバイル端末２０の各機能部に加え、切替部２４を含み、第１実施形態に係るモバイル端末２０のロード部２１に替えて、ロード部３２１を含む。
【０１１１】
ここで、モバイル端末３２０で利用されるＯＳの中には、例えば、Ｆｉｒｅｆｏｘ（登録商標）ＯＳのように、ＯＳ上で動作するアプリがウェブ技術のみで記述されるものが存在する。この場合、ＯＳが提供する機能についても、ウェブ技術からアクセスできるＡＰＩとして提供される。したがって、デバイスドライバもウェブ技術のみで記述することができる。そのため、例えば、ＯＳがＡｎｄｒｏｉｄ（登録商標）の場合には、デバイスドライバとして、ＪａｖａＳｃｒｉｐｔ部分３０ＡとＪａｖａ部分３０Ｂとを使い、Ｆｉｒｅｆｏｘ  ＯＳではＪａｖａＳｃｒｉｐｔ部分３０Ａのみを使うことになる。そこで、第３実施形態では、モバイル端末３２０に搭載されたＯＳによって、使用するデバイスドライバを切り替える。
【０１１２】
ロード部３２１は、第１実施形態に係るロード部２１と同様、ドライバ記憶部３７に記憶されたデバイスドライバ３０のＪａｖａ部分３０Ｂのロード、及びＪａｖａＳｃｒｉｐｔ部分３０Ａのインポートを行う。この際、モバイル端末３２０に搭載されたＯＳが、例えばＦｉｒｅｆｏｘ  ＯＳのように、ウェブ技術のみで全てを処理する場合、すなわち、ネイティブ言語を認識できない場合には、Ｊａｖａ部分３０Ｂは、ロードされない。ロード部３２１は、Ｊａｖａ部分３０Ｂをロードできたか否かを示す情報を、切替部２４に通知する。
【０１１３】
切替部２４は、ロード部３２１からの通知に基づいて、ＪａｖａＳｃｒｉｐｔ部分３０Ａから直接デバイス情報交換部３８にアクセスするか、第１実施形態と同様に、Ｊａｖａ部分３０Ｂを呼び出すかを切り替える。具体的には、切替部２４は、ＪａｖａＳｃｒｉｐｔ部分３０Ａからアクセス可能なＡＰＩを提供し、このＡＰＩにＪａｖａＳｃｒｉｐｔ部分３０Ａからアクセスされた際に、Ｊａｖａ部分３０Ｂが存在するか否かを示す情報を返す。ＪａｖａＳｃｒｉｐｔ部分３０Ａは、この切替部２４のＡＰＩからの返答に基づいて、アクセス先を切り替えることができる。具体的には、Ｊａｖａ部分３０Ｂが存在する場合には、第１実施形態と同様に、ＪａｖａＳｃｒｉｐｔ部分３０Ａは、呼び出されたＡＰＩを汎用ＡＰＩに変換して、アクセス部２２へ受け渡す。Ｊａｖａ部分３０Ｂが存在しない場合には、ＪａｖａＳｃｒｉｐｔ部分３０Ａは、呼び出されたＡＰＩが示す制御命令を、直接デバイス情報交換部３８に受け渡す。
【０１１４】
モバイル端末３２０は、例えば図７に示すコンピュータ６０で実現することができる。コンピュータ６０の記憶部６３には、コンピュータ６０をモバイル端末３２０として機能させるための情報処理プログラム３７０が記憶される。ＣＰＵ６１は、情報処理プログラム３７０を記憶部６３から読み出してメモリ６２に展開し、情報処理プログラム３７０が有するプロセスを順次実行する。情報処理プログラム３７０は、ロードプロセス３７１と、アクセスプロセス７２と、切替プロセスと７４と、情報処理プロセス８０とを有する。
【０１１５】
ＣＰＵ６１は、ロードプロセス３７１を実行することで、図１２に示すロード部３２１として動作する。また、ＣＰＵ６１は、切替プロセス７４を実行することで、図１２に示す切替部２４として動作する。他のプロセスについては、第１実施形態における情報処理プログラム７０と同様である。これにより、情報処理プログラム３７０を実行したコンピュータ６０が、モバイル端末３２０として機能することになる。
【０１１６】
次に、第３実施形態に係る情報処理システム３１０の作用について説明する。第３実施形態では、モバイル端末３２０において、図１３に示す情報処理ルーチンが実行される。なお、第３実施形態における情報処理ルーチンにおいて、第１実施形態に係る情報処理ルーチン（図８）と同様の処理については、同一の符号を付して、詳細な説明を省略する。
【０１１７】
ステップＳ１５で、ＯＳがＪａｖａを認識可能な場合には、ロード部３２１が、Ｊａｖａ部分３０Ｂをロードすると共に、ＡＰＩ情報をＡＰＩテーブル２５に記憶する。一方、ＯＳがＪａｖａを認識できない場合には、Ｊａｖａ部分３０Ｂはロードされない。
【０１１８】
次に、ステップＳ３１１で、ロード部３２１が、上記ステップＳ１５において、Ｊａｖａ部分３０Ｂをロードできたか否かを切替部２４に通知する。次に、ステップＳ１６〜Ｓ１８を経て、ステップＳ３１２で、ＪａｖａＳｃｒｉｐｔ部分３０Ａが切替部２４にアクセスする。切替部２４は、上記ステップＳ３１１でロード部３２１から通知されたＪａｖａ部分３０Ｂのロード結果に基づいて、Ｊａｖａ部分３０Ｂが存在するか否かの情報を、ＪａｖａＳｃｒｉｐｔ部分３０Ａに返す。ＪａｖａＳｃｒｉｐｔ部分３０Ａは、切替部２４からの返答に基づいて、Ｊａｖａ部分３０Ｂが存在するか否かを判定する。Ｊａｖａ部分３０Ｂが存在する場合には、処理はステップＳ３１３へ移行し、Ｊａｖａ部分経由アクセス処理が実行される。Ｊａｖａ部分経由アクセス処理は、第１実施形態における情報処理ルーチンのステップＳ１９〜Ｓ２３と同様の処理である。
【０１１９】
一方、Ｊａｖａ部分３０Ｂが存在しない場合には、処理はステップＳ３１４へ移行し、ＪａｖａＳｃｒｉｐｔ部分３０Ａが、呼び出されたＡＰＩが示す制御命令を、直接デバイス情報交換部３８に受け渡す。
【０１２０】
次に、ステップＳ２４で、ＪａｖａＳｃｒｉｐｔ部分３０Ａが、連携部３４又はデバイス情報交換部３８からの応答を受け付け、ＪａｖａＳｃｒｉｐｔ部分３０ＡのＡＰＩを呼び出したアプリに返答する。そして、ステップＳ２５で、応答に応じた情報表示が行われ、情報処理ルーチンは終了する。
【０１２１】
以上説明したように、第３実施形態に係る情報処理システム３１０によれば、ネイティブ言語で記述された第２モジュールが存在するか否かに応じて、ウェブ技術で記述された第１モジュールからのアクセス先を切り替える。これにより、デバイスドライバをダウンロードしたモバイル端末３２０に搭載されたＯＳに応じて、適切に動作を切り替えることができる。
【０１２２】
また、第２モジュールが動作するか否かに関係なく、第１モジュール（ＪａｖａＳｃｒｉｐｔ部分）は、例えば、Ａｎｄｒｏｉｄ、ｉＯＳ、Ｆｉｒｅｆｏｘ  ＯＳのいずれのＯＳでも動作する。そのため、第１モジュールについては、共通化することができるため、ＯＳに依存することなく、１つのデバイスドライバ３０を用意しておけばよい。したがって、デバイスドライバ３０の開発を効率化することができる。
【０１２３】
なお、第３実施形態では、ＯＳに依存することなく、１つのデバイスドライバ３０をダウンロードして、周辺デバイス５０の利用時に、使用するモジュールを第１モジュールか、第２モジュールかに切り替える場合について説明したが、これに限定されない。ＯＳに応じて、ダウンロードするデバイスドライバを切り替えるようにしてもよい。具体的には、ドライバ取得部３６がデバイスドライバをダウンロードする際に、デバイスドライバ配信サーバ５２にＯＳ情報を送信する。デバイスドライバ配信サーバ５２では、このＯＳ情報に対応したデバイスドライバを配信する。これにより、周辺デバイス５０の利用時に動作を切り替えることなく、ＯＳに応じた動作を実行することができる。
【０１２４】
例えば、ＯＳがＡｎｄｒｏｉｄの場合には、上記各実施形態と同様に、以下に示すような情報ファイルを送信し、ＪａｖａＳｃｒｉｐｔ部分３０ＡとＪａｖａ部分３０Ｂとを含むデバイスドライバ３０を配信する。
【０１２５】
{ "java_driver": "driver.jar", "java_driver_class": "com.fujitsu.jp.driver.BloodPressure",
"js_driver": "driverAndroidOS.js" }
【０１２６】
また、ＯＳがＦｉｒｅｆｏｘ  ＯＳの場合には、以下に示すような情報ファイルを送信し、ＪａｖａＳｃｒｉｐｔ部分３０Ａのみのデバイスドライバを配信する。
【０１２７】
{ "js_driver": "driverFirefoxOS.js" }
【０１２８】
また、情報ファイルには、Ｊａｖａ部分３０Ｂ及びＪａｖａＳｃｒｉｐｔ部分３０Ａの両方のファイルの情報を含めておき、デバイスドライバを取得するためのＵＲＬを作成する際に、必要なデバイスドライバのみを取得するようなＵＲＬを作成してもよい。
【０１２９】
＜第４実施形態＞
次に、第４実施形態について説明する。なお、第４実施形態に係る情報処理システムについて、第１実施形態に係る情報処理システム１０と同様の部分については、同一符号を付して、詳細な説明を省略する。
【０１３０】
図１に示すように、第４実施形態に係る情報処理システム４１０は、モバイル端末４２０と、周辺デバイス５０と、デバイスドライバ配信サーバ５２と、アプリ配信サーバ５４とを含む。
【０１３１】
図１４に、モバイル端末４２０の概略構成を示す。モバイル端末４２０は、第１実施形態に係るモバイル端末２０のロード部２１に替えて、ロード部４２１を含み、アクセス部２２に代えてアクセス部４２２を含む。
【０１３２】
ロード部４２１は、第１実施形態に係るロード部２１と同様、ドライバ記憶部３７に記憶されたデバイスドライバ３０のＪａｖａ部分３０Ｂのロード、及びＪａｖａＳｃｒｉｐｔ部分３０Ａのインポートを行う。また、ロード部４２１は、ＪａｖａＳｃｒｉｐｔ部分３０Ａのインポートの際、例えば、ｖａｒ  ｓｅｃｒｅｔ  ＝  ａｂｃｄｅｆ１２３４５６のような変数を設定する。さらに、ロード部４２１は、例えば、以下に示すように、Ｊａｖａ部分３０Ｂを呼び出すＡＰＩに、設定した変数を引数として含めるように、ＪａｖａＳｃｒｉｐｔ部分３０Ａに記述する。
【０１３３】
function getSystolic(success, failure, unit) {
cordova.exec(success, failure, "JavaDriver", "call_java", ["getSystolic", secret, unit]);
}
【０１３４】
また、ロード部４２１は、設定した変数をアクセス部４２２へ通知する。
【０１３５】
アクセス部４２２は、ＪａｖａＳｃｒｉｐｔ部分３０Ａから受け渡された汎用ＡＰＩに引数として含まれる変数と、ロード部４２１から通知された変数とが一致するか否かを判定する。アクセス部４２２は、変数が一致する場合に、Ｊａｖａ部分３０Ｂを呼び出し、一致しない場合には、ＪａｖａＳｃｒｉｐｔ部分３０Ａにエラーを返す。
【０１３６】
モバイル端末４２０は、例えば図７に示すコンピュータ６０で実現することができる。コンピュータ６０の記憶部６３には、コンピュータ６０をモバイル端末４２０として機能させるための情報処理プログラム４７０が記憶される。ＣＰＵ６１は、情報処理プログラム４７０を記憶部６３から読み出してメモリ６２に展開し、情報処理プログラム４７０が有するプロセスを順次実行する。情報処理プログラム４７０は、ロードプロセス４７１と、アクセスプロセス４７２と、情報処理プロセス８０とを有する。
【０１３７】
ＣＰＵ６１は、ロードプロセス４７１を実行することで、図１４に示すロード部４２１として動作する。また、ＣＰＵ６１は、アクセスプロセス４７２を実行することで、図１４に示すアクセス部４２２として動作する。他のプロセスについては、第１実施形態における情報処理プログラム７０と同様である。これにより、情報処理プログラム４７０を実行したコンピュータ６０が、モバイル端末４２０として機能することになる。
【０１３８】
次に、第４実施形態に係る情報処理システム４１０の作用について説明する。第４実施形態では、モバイル端末４２０において、図１５に示す情報処理ルーチンが実行される。なお、第４実施形態における情報処理ルーチンにおいて、第１実施形態に係る情報処理ルーチン（図８）と同様の処理については、同一の符号を付して、詳細な説明を省略する。
【０１３９】
ステップＳ１５の次のステップＳ４１２で、ロード部４２１が、変数を設定すると共に、設定した変数をアクセス部４２２に通知する。
【０１４０】
次に、ステップＳ４１２で、ロード部４２１が、ＪａｖａＳｃｒｉｐｔ部分３０Ａのインポートを行い、Ｊａｖａ部分３０Ｂを呼び出すＡＰＩに、設定した変数を引数として含めるように、ＪａｖａＳｃｒｉｐｔ部分３０Ａに記述する。
【０１４１】
次に、ステップＳ１７及びＳ１８を経て、次のステップＳ４１３で、アプリ４５から呼び出されたＪａｖａＳｃｒｉｐｔ部分３０ＡのＡＰＩの引数として、上記ステップＳ４１１で設定された変数を含め、汎用ＡＰＩに変換して、アクセス部４２２へ受け渡す。
【０１４２】
次に、ステップＳ４１４で、アクセス部４２２が、ＪａｖａＳｃｒｉｐｔ部分３０Ａから受け渡された汎用ＡＰＩに引数として含まれる変数と、上記ステップＳ４１１でロード部４２１から通知された変数とが一致するか否かを判定する。変数が一致する場合には、第１実施形態と同様に、ステップＳ２０〜Ｓ２５が実行される。一方、変数が一致しない場合には、処理はステップＳ４１５へ移行し、アクセス部４２２が、ＪａｖａＳｃｒｉｐｔ部分３０Ａを経由して、アプリ４５にエラーを返して、情報処理ルーチンを終了する。
【０１４３】
以上説明したように、第４実施形態に係る情報処理システム４１０によれば、ウェブ技術で記述された第１モジュールと、アクセス部４２２とに、同一の変数を持たせる。そして、第１モジュールから第２モジュールを呼び出す際に、第１モジュールが持つ変数と、アクセス部４２２が持つ変数とが一致するか否かに基づいて、第２モジュールへのアクセスを許可するか否かを判定する。これにより、第１モジュール以外のモジュールから第２モジュールが呼び出されることを防止することができ、セキュリティが強化される。
【０１４４】
＜第５実施形態＞
次に、第５実施形態について説明する。なお、第５実施形態に係る情報処理システムについて、第１実施形態に係る情報処理システム１０と同様の部分については、同一符号を付して、詳細な説明を省略する。
【０１４５】
図１に示すように、第５実施形態に係る情報処理システム５１０は、モバイル端末５２０と、周辺デバイス５０と、デバイスドライバ配信サーバ５２と、アプリ配信サーバ５４とを含む。
【０１４６】
モバイル端末５２０に搭載されるＯＳによっては、複数のネイティブ言語を使用するものがある。例えば、Ａｎｄｒｏｉｄの場合、ネイティブ言語として、ＪａｖａだけでなくＣ言語も使用することができる。そこで、第５実施形態では、デバイスドライバを、ＪａｖａＳｃｒｉｐｔで記述された第１モジュール、Ｊａｖａで記述された第２モジュール、及びＣ言語で記述された第３モジュールを含む構成とする。
【０１４７】
図１６に、モバイル端末５２０の概略構成を示す。モバイル端末５２０は、第１実施形態に係るモバイル端末２０のロード部２１に替えて、ロード部５２１を含み、アクセス部２２に替えて、アクセス部５２２を含む。また、モバイル端末５２０は、第１実施形態に係るモバイル端末２０のドライバ取得部３６に替えて、ドライバ取得部５３６を含む。
【０１４８】
上述したように、第５実施形態では、３つのモジュールを含むデバイスドライバを使用するため、ドライバ取得部５３６は、例えば、以下のように拡張された情報ファイルを、デバイスドライバ配信サーバ５２から取得する。そして、ドライバ取得部５３６は、ＪａｖａＳｃｒｉｐｔ部分３０Ａ及びＪａｖａ部分３０Ｂと同様に、ｃ＿ｄｒｉｖｅｒの情報に基づいて、Ｃ言語部分３０Ｃのファイルをダウンロードする。
【０１４９】
{ "java_driver": "driver.jar", "java_driver_class": "com.fujitsu.jp.driver.BloodPressure", 
"js_driver": "driver.js", 
"c_driver":"driver.lib" }
【０１５０】
ロード部５２１は、第１実施形態に係るロード部２１と同様、ドライバ記憶部３７に記憶されたデバイスドライバ３０のＪａｖａ部分３０Ｂのロード、及びＪａｖａＳｃｒｉｐｔ部分３０Ａのインポートを行う。また、ロード部５２１は、ドライバ記憶部３７に記憶されたデバイスドライバ３０のＣ言語部分３０Ｃのロードも行う。さらに、ロード部５２１は、Ｃ言語部分３０Ｃのロードの際、Ｃ言語部分３０ＣのＡＰＩ情報を取得して、ＡＰＩテーブル５２５に記憶する。Ｃ言語部分３０ＣのＡＰＩ情報は、第１実施形態におけるＪａｖａ部分３０ＢのＡＰＩ情報の取得と同様に取得することができる。ＡＰＩテーブル５２５には、図６に示すようなＪａｖａ部分３０ＢのＡＰＩ情報を記憶したテーブルと、同様の形式のＣ言語部分３０ＣのＡＰＩ情報を記憶したテーブルとが含まれる。Ｊａｖａ部分３０ＢのＡＰＩ情報は、Ｃ言語部分３０Ｃを呼び出すＡＰＩ情報を含む。
【０１５１】
アクセス部５２２は、ＪａｖａＳｃｒｉｐｔ部分３０Ａから受け取った汎用ＡＰＩ及びＡＰＩテーブル５２５のＪａｖａ部分３０ＢのＡＰＩ情報に基づいて、Ｊａｖａ部分３０ＢのＡＰＩを呼び出す。Ｊａｖａ部分３０Ｂは、呼び出されたＡＰＩをアクセス部５２２に受け渡す。アクセス部５２２は、Ｊａｖａ部分３０Ｂから受け取ったＡＰＩ及びＡＰＩテーブル５２５のＣ言語部分３０ＣのＡＰＩ情報に基づいて、Ｃ言語部分３０ＣのＡＰＩを呼び出す。Ｃ言語部分３０Ｃは、呼び出されたＡＰＩに応じて、周辺デバイス５０を制御する情報をデバイス情報交換部３８に通知する。
【０１５２】
モバイル端末５２０は、例えば図７に示すコンピュータ６０で実現することができる。コンピュータ６０の記憶部６３には、コンピュータ６０をモバイル端末５２０として機能させるための情報処理プログラム５７０が記憶される。ＣＰＵ６１は、情報処理プログラム５７０を記憶部６３から読み出してメモリ６２に展開し、情報処理プログラム５７０が有するプロセスを順次実行する。情報処理プログラム５７０は、ロードプロセス５７１と、アクセスプロセス５７２と、情報処理プロセス８０とを有する。
【０１５３】
ＣＰＵ６１は、ロードプロセス５７１を実行することで、図１６に示すロード部５２１として動作する。また、ＣＰＵ６１は、アクセスプロセス５７２を実行することで、図１６に示すアクセス部５２２として動作する。他のプロセスについては、第１実施形態における情報処理プログラム７０と同様である。これにより、情報処理プログラム５７０を実行したコンピュータ６０が、モバイル端末５２０として機能することになる。
【０１５４】
次に、第５実施形態に係る情報処理システム５１０の作用について説明する。第５実施形態では、モバイル端末５２０において、図１７に示す情報処理ルーチンが実行される。なお、第５実施形態における情報処理ルーチンにおいて、第１実施形態に係る情報処理ルーチン（図８）と同様の処理については、同一の符号を付して、詳細な説明を省略する。
【０１５５】
ステップＳ１４の次のステップＳ５１１で、ロード部５２１が、Ｊａｖａ部分３０Ｂをロードすると共に、Ｊａｖａ部分３０ＢのＡＰＩ情報を取得して、ＡＰＩテーブル５２５に記憶する。また、ロード部５２１は、Ｃ言語部分３０Ｃをロードすると共に、Ｃ言語部分３０ＣのＡＰＩ情報を取得して、ＡＰＩテーブル５２５に記憶する。
【０１５６】
次に、ステップＳ１６〜Ｓ１９を経て、次のステップＳ５１２で、アクセス部５２２が、汎用ＡＰＩ及びＡＰＩテーブル５２５に基づいて、Ｊａｖａ部分３０ＢのＡＰＩを呼び出す。次に、ステップＳ５１３で、アクセス部５２２が、Ｊａｖａ部分３０Ｂから呼び出されたＡＰＩ及びＡＰＩテーブル５２５のＣ言語部分３０ＣのＡＰＩ情報に基づいて、Ｃ言語部分３０ＣのＡＰＩを呼び出す。そして、Ｃ言語部分３０Ｃは、呼び出されたＡＰＩに応じて、周辺デバイス５０を制御する情報をデバイス情報交換部３８に通知する。
【０１５７】
次に、ステップＳ２１で、デバイス情報交換部３８が、周辺デバイス５０にアクセスする。次に、ステップＳ５１４で、デバイス情報交換部３８が、周辺デバイス５０から取得した情報を、Ｃ言語部分３０Ｃで呼び出されたＡＰＩに対して返答する。次に、ステップＳ５１５で、Ｃ言語部分３０Ｃが、周辺デバイス５０から取得した情報を、Ｊａｖａ部分３０Ｂで呼び出されたＡＰＩに対して返答する。以下、第１実施形態と同様に、ステップＳ２３〜Ｓ２５の処理を実行し、情報処理ルーチンは終了する。
【０１５８】
以上説明したように、第５実施形態に係る情報処理システム５１０によれば、モバイル端末５２０に搭載されたＯＳが、複数のネイティブ言語を使用できる場合には、複数種類のネイティブ言語で記述されたモジュールを含むデバイスドライバを使用する。これにより、例えば、Ｊａｖａで記述されたプログラムよりも動作が速いＣ言語で記述されたプログラムを使用することで、デバイスドライバの処理を高速化することができる。また、例えば、過去に開発されたＣ言語で記述されたデバイスドライバを、デバイスドライバのＣ言語部分３０Ｃとして流用することができ、デバイスドライバの開発を効率化することができる。
【０１５９】
なお、上記各実施形態では、主に、第１モジュールをＪａｖａＳｃｒｉｐｔで記述されたモジュール、及び第２モジュールをＪａｖａで記述されたモジュールとする場合について説明した。また、第５実施形態においては、第３モジュールをＣ言語で記述されたモジュールとする場合について説明した。しかし、各モジュールは、これらの言語で記述された場合に限定されない。第１モジュールは、アプリケーションで認識可能な言語で記述されたものであればよく、第２モジュール及び第３モジュールは、周辺デバイス又は周辺デバイスを制御するＯＳで認識可能な言語で記述されていればよい。特に、第１モジュールは、ウェブ技術で記述し、第２モジュール及び第３モジュールは、ネイティブ言語で記述することにより、ハイブリッドアプリに適用することができる。これにより、開発者の多いウェブ技術が使用可能であると共に、過去に開発されたネイティブ言語のデバイスドライバも活用可能である。
【０１６０】
なお、上記各実施形態では、各情報処理プログラムが記憶部６３に予め記憶（インストール）されている態様を説明したが、これに限定されない。開示の技術に係るプログラムは、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭ、ＵＳＢメモリ等の記録媒体に記録された形態で提供することも可能である。
【０１６１】
以上の各実施形態に関し、更に以下の付記を開示する。
【０１６２】
（付記１）
第１の言語で記述され、かつアプリケーションからデバイスを制御する際にアクセスされる第１インターフェースが定義された第１モジュールと、前記第１の言語とは異なる第２の言語で記述され、かつ前記第１インターフェースに対応する第２インターフェースが定義された第２モジュールとを含むデバイスドライバをロードすると共に、前記第２モジュールに定義された前記第２インターフェースに関する情報を取得するロード部と、
前記第１モジュールから受け付けた前記第１インターフェースに関する情報と、前記ロード部により取得された前記第２インターフェースに関する情報とに基づいて、前記第２モジュールに定義された前記第２インターフェースへアクセスするアクセス部と、
を含む情報処理装置。
【０１６３】
（付記２）
前記第１モジュールはウェブ技術で記述され、前記第２モジュールはネイティブ言語で記述された付記１記載の情報処理装置。
【０１６４】
（付記３）
前記ロード部は、前記第２の言語とは異なる第３の言語で記述され、かつ前記第２インターフェースに対応する第３インターフェースが定義された第３モジュールをさらに含む前記デバイスドライバをロードする際に、前記第３モジュールに定義された前記第３インターフェースに関する情報を取得し、
前記アクセス部は、前記第１モジュールから受け付けた前記第１インターフェースに関する情報と、前記ロード部により取得された前記第２インターフェースに関する情報及び前記第３インターフェースに関する情報とに基づいて、前記第３モジュールに定義された前記第３インターフェースへアクセスする
付記１又は付記２記載の情報処理装置。
【０１６５】
（付記４）
前記第２モジュールがロードされている場合には、前記アクセス部に、前記第２インターフェースへアクセスさせ、前記第２モジュールがロードされていない場合には、前記第１モジュールから前記デバイスへアクセスさせるように切り替える切替部を含む付記１〜付記３のいずれか１項記載の情報処理装置。
【０１６６】
（付記５）
情報処理装置に搭載されたオペレーティングシステムの種別に応じたデバイスドライバを取得する取得部をさらに含む付記１〜付記４のいずれか１項記載の情報処理装置。
【０１６７】
（付記６）
前記ロード部は、前記第１モジュールからの要求により、前記第２モジュールをロードする付記１〜付記５のいずれか１項記載の情報処理装置。
【０１６８】
（付記７）
前記ロード部は、前記アクセス部が前記第２インターフェースへアクセスする際に、前記第２モジュールをロードする付記１〜付記５のいずれか１項記載の情報処理装置。
【０１６９】
（付記８）
前記ロード部は、前記第１モジュールに付加情報を設定すると共に、前記付加情報を前記アクセス部へ通知し、
前記アクセス部は、前記第１モジュールから受け付けた前記第１インターフェースに関する情報に付加された付加情報と、前記ロード部から通知された付加情報との照合結果に基づいて、前記第２インターフェースへのアクセスを許可するか否かを判定する
付記１〜付記７のいずれか１項記載の情報処理装置。
【０１７０】
（付記９）
前記ロード部は、前記第１モジュールからの要求により、又は前記第１モジュールをアンロードする際に、前記第２モジュールをアンロードする付記１〜付記８のいずれか１項記載の情報処理装置。
【０１７１】
（付記１０）
前記ロード部により取得された前記第２インターフェースに関する情報に基づいて、前記第１モジュールを生成する生成部をさらに含む付記１〜付記９のいずれか１項記載の情報処理装置。
【０１７２】
（付記１１）
前記生成部は、生成した前記第１モジュールを記憶すると共に、第２モジュールがロードされる際に、該第２モジュールに定義された第２インターフェースに対応する第１インターフェースが定義された第１モジュールを、記憶された前記第１モジュールから検索して利用する付記１０記載の情報処理装置。
【０１７３】
（付記１２）
前記生成部は、同等の機能を有する第２インターフェースを同一の第１インターフェースに対応付けた対応表に基づいて、前記第１モジュールを生成する付記１０記載の情報処理装置。
【０１７４】
（付記１３）
コンピュータに、
第１の言語で記述され、かつアプリケーションからデバイスを制御する際にアクセスされる第１インターフェースが定義された第１モジュールと、前記第１の言語とは異なる第２の言語で記述され、かつ前記第１インターフェースに対応する第２インターフェースが定義された第２モジュールとを含むデバイスドライバをロードすると共に、前記第２モジュールに定義された前記第２インターフェースに関する情報を取得し、
前記第１モジュールから受け付けた前記第１インターフェースに関する情報と、取得された前記第２インターフェースに関する情報とに基づいて、前記第２モジュールに定義された前記第２インターフェースへアクセスする
ことを含む処理を実行させる情報処理方法。
【０１７５】
（付記１４）
前記第１モジュールはウェブ技術で記述され、前記第２モジュールはネイティブ言語で記述された付記１３記載の情報処理方法。
【０１７６】
（付記１５）
前記第２の言語とは異なる第３の言語で記述され、かつ前記第２インターフェースに対応する第３インターフェースが定義された第３モジュールをさらに含む前記デバイスドライバをロードする際に、前記第３モジュールに定義された前記第３インターフェースに関する情報を取得し、
前記第１モジュールから受け付けた前記第１インターフェースに関する情報と、取得された前記第２インターフェースに関する情報及び前記第３インターフェースに関する情報とに基づいて、前記第３モジュールに定義された前記第３インターフェースへアクセスする
付記１３又は付記１４記載の情報処理方法。
【０１７７】
（付記１６）
前記コンピュータに、前記第２モジュールがロードされている場合には、前記第２インターフェースへアクセスし、前記第２モジュールがロードされていない場合には、前記第１モジュールから前記デバイスへアクセスさせるように切り替えることをさらに含む処理を実行させる付記１３〜付記１５のいずれか１項記載の情報処理方法。
【０１７８】
（付記１７）
前記コンピュータに、情報処理装置に搭載されたオペレーティングシステムの種別に応じたデバイスドライバを取得することをさらに含む処理を実行させる付記１３〜付記６のいずれか１項記載の情報処理方法。
【０１７９】
（付記１８）
前記第１モジュールからの要求により、前記第２モジュールをロードする付記１３〜付記１７のいずれか１項記載の情報処理方法。
【０１８０】
（付記１９）
前記第２インターフェースへのアクセスの際に、前記第２モジュールをロードする付記１３〜付記１７のいずれか１項記載の情報処理方法。
【０１８１】
（付記２０）
前記第１モジュールをロードする際に、前記第１モジュールに付加情報を設定し、
前記第２インターフェースへアクセスする際に、前記第１モジュールから受け付けた前記第１インターフェースに関する情報に付加された付加情報と、設定された付加情報との照合結果に基づいて、前記第２インターフェースへのアクセスを許可するか否かを判定する
付記１３〜付記１９のいずれか１項記載の情報処理方法。
【０１８２】
（付記２１）
前記コンピュータに、前記第１モジュールからの要求により、又は前記第１モジュールをアンロードする際に、前記第２モジュールをアンロードすることをさらに含む処理を実行させる付記１３〜付記２０のいずれか１項記載の情報処理方法。
【０１８３】
（付記２２）
前記コンピュータに、取得された前記第２インターフェースに関する情報に基づいて、前記第１モジュールを生成することをさらに含む処理を実行させる付記１３〜付記２１のいずれか１項記載の情報処理方法。
【０１８４】
（付記２３）
生成した前記第１モジュールを記憶すると共に、第２モジュールがロードされる際に、該第２モジュールに定義された第２インターフェースに対応する第１インターフェースが定義された第１モジュールを、記憶された前記第１モジュールから検索して利用する付記２２記載の情報処理方法。
【０１８５】
（付記２４）
同等の機能を有する第２インターフェースを同一の第１インターフェースに対応付けた対応表に基づいて、前記第１モジュールを生成する付記２２記載の情報処理方法。
【０１８６】
（付記２５）
コンピュータに、
第１の言語で記述され、かつアプリケーションからデバイスを制御する際にアクセスされる第１インターフェースが定義された第１モジュールと、前記第１の言語とは異なる第２の言語で記述され、かつ前記第１インターフェースに対応する第２インターフェースが定義された第２モジュールとを含むデバイスドライバをロードすると共に、前記第２モジュールに定義された前記第２インターフェースに関する情報を取得し、
前記第１モジュールから受け付けた前記第１インターフェースに関する情報と、取得された前記第２インターフェースに関する情報とに基づいて、前記第２モジュールに定義された前記第２インターフェースへアクセスする
ことを含む処理を実行させる情報処理プログラム。
【０１８７】
（付記２６）
前記第１モジュールはウェブ技術で記述され、前記第２モジュールはネイティブ言語で記述された付記２５記載の情報処理プログラム。
【０１８８】
（付記２７）
前記第２の言語とは異なる第３の言語で記述され、かつ前記第２インターフェースに対応する第３インターフェースが定義された第３モジュールをさらに含む前記デバイスドライバをロードする際に、前記第３モジュールに定義された前記第３インターフェースに関する情報を取得し、
前記第１モジュールから受け付けた前記第１インターフェースに関する情報と、前記ロード部により取得された前記第２インターフェースに関する情報及び前記第３インターフェースに関する情報とに基づいて、前記第３モジュールに定義された前記第３インターフェースへアクセスする
付記２５又は付記２６記載の情報処理プログラム。
【０１８９】
（付記２８）
前記コンピュータに、前記第２モジュールがロードされている場合には、前記第２インターフェースへアクセスし、前記第２モジュールがロードされていない場合には、前記第１モジュールから前記デバイスへアクセスさせるように切り替えることをさらに含む処理を実行させる付記２５〜付記２７のいずれか１項記載の情報処理プログラム。
【０１９０】
（付記２９）
前記コンピュータに、情報処理装置に搭載されたオペレーティングシステムの種別に応じたデバイスドライバを取得することをさらに含む処理を実行させる付記２５〜付記６のいずれか１項記載の情報処理プログラム。
【０１９１】
（付記３０）
前記第１モジュールからの要求により、前記第２モジュールをロードする付記２５〜付記２９のいずれか１項記載の情報処理プログラム。
【０１９２】
（付記３１）
前記第２インターフェースへのアクセスの際に、前記第２モジュールをロードする付記２５〜付記２９のいずれか１項記載の情報処理プログラム。
【０１９３】
（付記３２）
前記第１モジュールをロードする際に、前記第１モジュールに付加情報を設定し、
前記第２インターフェースへアクセスする際に、前記第１モジュールから受け付けた前記第１インターフェースに関する情報に付加された付加情報と、設定された付加情報との照合結果に基づいて、前記第２インターフェースへのアクセスを許可するか否かを判定する
付記２５〜付記３１のいずれか１項記載の情報処理プログラム。
【０１９４】
（付記３３）
前記コンピュータに、前記第１モジュールからの要求により、又は前記第１モジュールをアンロードする際に、前記第２モジュールをアンロードすることをさらに含む処理を実行させる付記２５〜付記３２のいずれか１項記載の情報処理プログラム。
【０１９５】
（付記３４）
前記コンピュータに、取得された前記第２インターフェースに関する情報に基づいて、前記第１モジュールを生成することをさらに含む処理を実行させる付記２５〜付記３３のいずれか１項記載の情報処理プログラム。
【０１９６】
（付記３５）
生成した前記第１モジュールを記憶すると共に、第２モジュールがロードされる際に、該第２モジュールに定義された第２インターフェースに対応する第１インターフェースが定義された第１モジュールを、記憶された前記第１モジュールから検索して利用する付記３４記載の情報処理プログラム。
【０１９７】
（付記３６）
同等の機能を有する第２インターフェースを同一の第１インターフェースに対応付けた対応表に基づいて、前記第１モジュールを生成する付記３４記載の情報処理プログラム。
【０１９８】
（付記３７）
コンピュータに、
第１の言語で記述され、かつアプリケーションからデバイスを制御する際にアクセスされる第１インターフェースが定義された第１モジュールと、前記第１の言語とは異なる第２の言語で記述され、かつ前記第１インターフェースに対応する第２インターフェースが定義された第２モジュールとを含むデバイスドライバをロードすると共に、前記第２モジュールに定義された前記第２インターフェースに関する情報を取得し、
前記第１モジュールから受け付けた前記第１インターフェースに関する情報と、取得された前記第２インターフェースに関する情報とに基づいて、前記第２モジュールに定義された前記第２インターフェースへアクセスする
ことを含む処理を実行させる情報処理プログラムを記憶した記憶媒体。
【符号の説明】
【０１９９】
１０、２１０、３１０、４１０、５１０      情報処理システム
２０、２２０、３２０、４２０、５２０      モバイル端末
２１、２２１、３２１、４２１、５２１      ロード部
２２、４２２、５２２ アクセス部
２３   生成部
２４   切替部
２５、５２５  ＡＰＩテーブル
３０   デバイスドライバ
３０Ａ ＪａｖａＳｃｒｉｐｔ部分
３０Ｂ Ｊａｖａ部分
３０Ｃ Ｃ言語部分
３１   アプリ受信部
３２   アプリ記憶部
３３   アプリ起動部
３４   連携部
３５   デバイス検出部
３６、５３６  ドライバ取得部
３７   ドライバ記憶部
３８   デバイス情報交換部
３９   通信部
４０   ＵＩ制御部
４５   アプリケーション
５０   周辺デバイス
５２   デバイスドライバ配信サーバ
５４   アプリ配信サーバ
６０   コンピュータ
６１   ＣＰＵ
６２   メモリ
６３   記憶部
６９   記録媒体
７０、２７０、３７０、４７０、５７０      情報処理プログラム
【図１】
0006493130.tif 000002
【図２】
0006493130.tif 000003
【図３】
0006493130.tif 000004
【図４】
0006493130.tif 000005
【図５】
0006493130.tif 000006
【図６】
0006493130.tif 000007
【図７】
0006493130.tif 000008
【図８】
0006493130.tif 000009
【図９】
0006493130.tif 000010
【図１０】
0006493130.tif 000011
【図１１】
0006493130.tif 000012
【図１２】
0006493130.tif 000013
【図１３】
0006493130.tif 000014
【図１４】
0006493130.tif 000015
【図１５】
0006493130.tif 000016
【図１６】
0006493130.tif 000017
【図１７】
0006493130.tif 000018