EGL プログラムは、C 関数を呼び出すことができます。
C 関数を EGL から呼び出す手順は、次のとおりです。
1. EGL スタック・ライブラリーとアプリケーション・オブジェクト・ファイルをダウンロードする
http://www3.software.ibm.com/ibmdl/pub/software/rationalsdp/rad/60/redist
http://www3.software.ibm.com/ibmdl/pub/software/rationalsdp/rwd/60/redist
2. すべての C コードを共用ライブラリーにコンパイルする
C コードは、ポップ外部関数を使用して EGL から値を受け取り、戻り外部関数を使用して EGL に値を戻します。ポップ外部関数については、『EGL からの値の受け取り』で、 戻り外部関数については、『EGL への値の戻り』で説明します。
cc -c -Iincl_dir file1.c file2.c ld -G -b32 -bexpall -bnoentry -brtl file1.o file2.o -Lstack_lib_dir -lstack -o lib1_name -lc
cc -c -Iincl_dir file1.c file2.c gcc -shared file1.o file2.o -Lstack_lib_dir -lstack -o lib1_name
Windows® では、以下のようになります (link コマンドは単一行上に存在する必要があります)。
cl /c -Iincl_dir file1.c file2.c link /DLL file1.obj file2.obj /LIBPATH:stack_lib_dir /DEFAULTLIB:stack.lib /OUT:lib1_name
3. 関数テーブルを作成する
関数テーブルとは、EGL プログラムから呼び出されるすべての C 関数の名前を含む C ソース・ファイルです。 次の関数テーブル例では、c_fun1 と c_fun2 が C 関数の名前です。コード内で識別されるすべての関数は、上記のステップ 2 で作成した C 共用ライブラリーからエクスポート済みでなければなりません。
#include <stdio.h> struct func_table { char *fun_name; int (*fptr)(int); }; extern int c_fun1(int); extern int c_fun2(int); /* 他の関数に対しても同様のプロトタイプ */ struct func_table ftab[] = { "c_fun1", c_fun1, "c_fun2", c_fun2, /* 他の関数に対しても同様 */ "", NULL };
上記の例を基にして関数テーブルを作成し、適切な C 関数を使用して関数テーブルにデータを取り込みます。 "", NULL で関数テーブルの終わりを示します。
4. 関数テーブルとプラットフォーム固有のアプリケーション・オブジェクトを共用ライブラリーにコンパイルする
アプリケーション・オブジェクト・ファイルは、EGL コードと C コードとの間のインターフェースです。
次のサンプルを使用して新規の共用ライブラリーをコンパイルします。ここで ftable.c は、関数テーブルの名前、mylib は、ステップ 2 で作成した C 共用ライブラリーの名前、lib_dir は、mylib のディレクトリー・ロケーションです。dllName プロパティーまたは vgj.defaultI4GLNativeLibrary Java™ ランタイム・プロパティーを使用して lib2_name を指定します。
AIX では、以下のようになります (ld コマンドは単一行上に存在する必要があります)。
cc -c ftable.c ld -G -b32 -bexpall -bnoentry -brtl ftable.o application.o -Lstack_lib_dir -lstack -Llib_dir -lmylib -o lib2_name -lc
Linux では、 以下のようになります (gcc コマンドは単一行上に存在する必要があります)。
cc -c ftable.c gcc -shared ftable.o application.o -Lstack_lib_dir -lstack -Llib_dir -lmylib -o lib2_name
Windows では、以下のようになります (link コマンドは単一行上に存在する必要があります)。
cl /c ftable.c link /DLL ftable.obj application.obj /LIBPATH:stack_lib_dir /DEFAULTLIB:stack.lib /LIBPATH:lib_dir /DEFAULTLIB:mylib.lib /OUT:lib2_name
これら 3 つのライブラリーを一緒にリンクします。
C 共用ライブラリー、関数テーブル、およびスタック・ライブラリーがリンクされると、EGL コードから C 関数を呼び出すことができる状態になります。 EGL 内で C 関数を呼び出す方法については、『EGL プログラムからの C 関数の呼び出し』を参照してください。