概要
intra-mart ベースモジュール では、外部ライブラリの呼び出しが可能です。
外部ライブラリの作成から実行までを解説します。
外部ライブラリコールのアーキテクチャ
外部ライブラリの呼び出しは、ベースモジュールからJavaラッパークラスを経由して、
呼び出しを行います。
外部ライブラリの呼び出しは以下の手順で行います。
- ファンクション・コンテナの関数からJavaラッパークラスを生成します。
- Javaラッパークラスの関数を呼び出します。
(Javaラッパークラスの各関数が外部ライブラリの各関数と紐づいています。)
- 対応した外部ライブラリの関数が実行されます。
Javaラッパークラスと外部ライブラリの作成
ここでは、C言語で作成される外部ライブラリの作成方法について説明します。
作成に必要なもの
Javaラッパークラスと外部ライブラリを作成するには、以下のものが必要です。
- JDK (Javaラッパークラスを作成するために必要です)
- javac.exe (Javaラッパークラスをコンパイルします。)
- javah.exe (JavaラッパークラスからC言語用のヘッダファイルを作成します。)
- jni.h (外部ライブラリ作成時に使用する標準ヘッダファイル)
- Cコンパイラ (外部ライブラリを作成するために必要です)
ベースモジュールでの制約
ベースモジュールではJavaScriptから外部ライブラリを呼び出すために使用できる変数の型に制約を受けます。
以下に使用できる変数の型と対応する各言語の型を示します。
JavaScriptの型 | Javaの型 | Cの型 |
String | String | jstring |
Number | double | jdouble |
Boolean | boolean | jboolean |
作成手順
- Javaラッパークラス(.java)を作成します。
- javac.exeでJavaラッパークラス(.java)をコンパイルします。(.class の作成)
- javah.exeでjavaラッパークラス(.java)から、C言語用のヘッダファイル(.h)を作成します。
- 作成されたヘッダファイル(.h)を元に外部ライブラリファイル(.c)を作成します。
- 外部ライブラリファイル(.c)をコンパイルし、外部ライブラリ(.dll)を作成します。
Javaラッパークラスの作成
- 新規にクラスを作成します。
(この時、パッケージ名を必ずつけてください。)
- static エリア(初回CLASSロード時の処理)にロードするライブラリの名称を記述します。
System.loadLibrary("ライブラリ名");
ライブラリ名には、拡張子を除いたものを記述します。
- publicなメソッドを記述します。
public native 戻り型 関数名(引数の型 引数名, [.….] );
戻り値 および 引数の型は String , double , boolean のいずれかです。
ここでは、メソッドの宣言だけで、手続きは書かないことに注意してください。
- 作成したファイルをコンパイルします。
javac.exe ファイル名
作成したclassファイルを.jarファイルにもまとめます。
[作成例]
package Hellow;
public class Hellow {
static { // 初回CLASSロード時の処理
System.loadLibrary("Hellow"); // ロードするライブラリ(Hellow.dll)
}
public Hellow( ) { } // コンストラクタ
// 引数の文字列を結合する関数
public native String margeString(String a , String b);
// 引数の数値を合算する関数
public native double getPlus(double a , double b);
// 引数の論理積を求める関数
public native boolean getAnd(boolean a ,boolean b);
}
外部ライブラリの作成
- JavaラッパークラスからC言語用のヘッダファイルを作成します。
javah.exe ファイル名
[作成されるヘッダファイルのプロトタイプ]
JNIEXPORT 戻り型 JNICALL 関数名 ( JavaVMのポインタ,クラスのオブジェクト,各引数の型);
- C言語用のヘッダファイルを元に外部ライブラリファイルを作成します。
各関数の手続きを記述します。
- 外部ライブラリファイルをコンパイルして、(.dll)を作成します。
jstring(文字列)の扱い方
文字列はJava上では、UniCodeとして扱われます。
C言語で、利用するためには、UniCode → UTF-8への変換が必要です。
変換方法は以下の通りです。
*env | : JAVA-VMのインスタンス(関数の引数から渡されます) |
a | : 変換したい文字列(jstring型) UniCode |
*ca | : 変換後の文字列(char * 型) UTF-8 |
const char *ca = (*env)->GetStringUTFChars(env,a,0);
UTF-8に変換すると、C言語で通常の文字列として扱えます。
Javaへ値を返す時は、UTF-8 → UniCodeへの変換が必要です。
以下の例は、C言語の文字列から、Javaの文字列を作成する方法です 。
*env | : JAVA-VMのインスタンス(関数の引数から渡されます) |
jstr | : 作成した文字列(jstring型) UniCode |
buf | : 変換元の文字列(char * 型) UTF-8 |
jstr = (*env)->NewStringUTF(env,buf);
「作成されたヘッダファイルの例」
#include
#ifndef _Included_Hellow_Hellow
#define _Included_Hellow_Hellow
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT jstring JNICALL Java_Hellow_Hellow_margeString
(JNIEnv *, jobject, jstring, jstring);
JNIEXPORT jdouble JNICALL Java_Hellow_Hellow_getPlus
(JNIEnv *, jobject, jdouble, jdouble);
JNIEXPORT jboolean JNICALL Java_Hellow_Hellow_getAnd
(JNIEnv *, jobject, jboolean, jboolean);
#ifdef __cplusplus
}
#endif
#endif
「外部ライブラリファイルの例」
#include "Hellow_Hellow.h"
#include
/* 引数の文字列を結合する関数 */
JNIEXPORT jstring JNICALL Java_Hellow_Hellow_margeString
(JNIEnv *env, jobject jobj, jstring a, jstring b)
{
char buf[256]; /* テンポラリ文字列 */
jstring jstr; /* 戻り値用*/
/* 引数をユニコードからUTF-8への変換 */
const char *ca = (*env)->GetStringUTFChars(env,a,0);
const char *cb = (*env)->GetStringUTFChars(env,b,0);
strcpy(buf,ca); /* コピー*/
strcat(buf,cb); /* 結合 */
/* 戻り値の値をJava用のStringとして作成する。*/
jstr = (*env)->NewStringUTF(env,buf);
return jstr;
}
/* 引数の数値を合算する関数 */
JNIEXPORT jdouble JNICALL Java_Hellow_Hellow_getPlus
(JNIEnv *env, jobject jobj , jdouble a, jdouble b)
{
jdouble c; /* 戻り値用*/
c = a + b; /* 合算する */
return (c);
}
/* 引数の論理積を求める関数 */
JNIEXPORT jboolean JNICALL Java_Hellow_Hellow_getAnd
(JNIEnv *env, jobject jobj, jboolean a, jboolean b)
{
jboolean c ; /* 戻り値用*/
c = a & b ; /* 論理積を求める */
return (c);
}
外部ライブラリコールの方法
外部ライブラリコールの準備
- 作成した外部ライブラリ(DLLファイル)をPATHの通ったディレクトリに保存します。
- 作成したJavaラッパークラス(.jarファイル)を Application Runtime 起動時のクラスパスに追加します。
intra-mart Administrator のJAVA起動オプション画面からjarファイル名(フルパスで)追加します。
- Application Runtime を起動します。
JavaScriptからの呼び出し
- Javaラッパークラスを生成します。
objHellow = new Packages.パッケージ名.クラス名();
- 生成されたクラスから関数を呼び出します。
Answer = objHellow.関数名(引数);
- これで、外部ライブラリ関数の呼び出しが可能になります。
「JavaScriptの例」
function init(request){
var a;
var b;
var objHellow;
objHellow = new Packages.Hellow.Hellow(); // クラスのロード
a = "こんにちは " ;
b = "イントラマートです"
sAnswer = objHellow.margeString(a,b);
// オブジェクト型で帰ってくるので、文字列にする必要があります。
sAnswer = sAnswer + "";
a = 10;
b = 20;
nAnswer = objHellow.getPlus(a ,b);
a = true;
b = false;
bAnswer = objHellow.getAnd(a ,b);
}
|