EGL ライブラリー経由での C 関数の呼び出し
EGL プログラムでは、ステレオタイプが nativeLibrary のライブラリー・パーツを経由して、C 関数を呼び出すことができます。
- EGL プログラムで使用する C 関数を特定し、その関数が成功時に INT 型の値でゼロを返すことを確認する。
- EGL ランタイムをインストールし、スタック・ライブラリーとアプリケーション・オブジェクト・ファイルを見つける。
- EGL ランタイム・コードをインストールする。
- 対象となる以下のファイルを見つける。プラットフォーム固有のスタック・ライブラリーの場合
- AIX®: EGLRuntimes/Aix/bin/libstack.so
- Linux: EGLRuntimes/Linux/bin/libstack.so
- 32 ビット Windows プラットフォーム:
- EGLRuntimes/Win32/bin/stack.dll
- EGLRuntimes/Win32/bin/stack.lib
プラットフォーム固有のアプリケーション・オブジェクト・ファイルの場合- AIX: EGLRuntimes/Aix/bin/application.o
- Linux: EGLRuntimes/Linux/bin/application.o
- 32 ビット Windows プラットフォーム: EGLRuntimes/Win32/bin/application.obj
- すべての C コードを 1 つの共用ライブラリーにコンパイルし、適切なプラットフォーム固有のスタック・ライブラリーにリンクする。
C コードは、ポップ外部関数を使用して EGL から値を受け取り、戻り外部関数を使用して EGL に値を戻します。
すべての C コードを共用ライブラリーにコンパイルする手順は、次のとおりです。- 標準メソッドを使用して、すべての C コードを 1 つの共用ライブラリーにコンパイルし、適切なプラットフォーム固有の EGL スタック・ライブラリーにリンクする。
- 次のプラットフォーム固有の例では、file1.c と file2.c は、EGL から呼び出された関数を含む C ファイルになります。
AIX では、以下のようになります (ld コマンドは 1 行で指定する必要があります)。
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 -lcLinux では、以下のようになります (gcc コマンドは 1 行で入力する必要があります)。cc -c -Iincl_dir file1.c file2.c gcc -shared file1.o file2.o -Lstack_lib_dir -lstack -o lib1_nameWindows では、以下のようになります (link コマンドは 1 行で入力する必要があります)。
cl /c -Iincl_dir file1.c file2.c link /DLL file1.obj file2.obj /LIBPATH:stack_lib_dir /DEFAULTLIB:stack.lib /OUT:lib1_name- incl_dir
- ヘッダー・ファイルのディレクトリー・ロケーション
- stack_lib_dir
- スタック・ライブラリーのディレクトリー・ロケーション
- lib1_name
- 出力ライブラリーの名前
注: C コードが IBM® Informix® ESQL/C ライブラリー関数 (BIGINT、 DECIMAL、DATE、INTERVAL、DATETIME) を使用している場合、ESQL/C ライブラリーにもリンクする必要があります。 - 関数テーブルを作成する。
関数テーブルとは、EGL プログラムから呼び出されるすべての C 関数の名前を含む C ソース・ファイルです。 次の関数テーブル例では、c_fun1 と c_fun2 が C 関数の名前です。コード内で指定されるすべての関数は、前出のステップで作成した 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 で関数テーブルの終わりを示します。
- この関数テーブルと適切なプラットフォーム固有のアプリケーション・オブジェクト・ファイルを共用ライブラリーにコンパイルし、この共用ライブラリーを、ステップ 2 で作成した共用ライブラリーとスタック・ライブラリーにリンクする。
アプリケーション・オブジェクト・ファイルは、EGL コードと C コードとの間のインターフェースです。
次の 2 つの成果物を 1 つの共用ライブラリーにコンパイルし、上記のステップ 2 で作成したスタック・ライブラリーおよびライブラリーにリンクします。- 関数テーブル
- アプリケーション・オブジェクト・ファイル
次のサンプルを使用して新規の共用ライブラリーをコンパイルします。ここで ftable.c は、関数テーブルの名前、mylib は、ステップ 2 で作成した C 共用ライブラリーの名前、lib_dir は、mylib のディレクトリー・ロケーションです。dllName プロパティーまたは vgj.defaultI4GLNativeLibrary Java™ ランタイム・プロパティーを使用して lib2_name を指定します。
AIX では、以下のようになります (ld コマンドは 1 行で指定する必要があります)。
cc -c ftable.c ld -G -b32 -bexpall -bnoentry -brtl ftable.o application.o -Lstack_lib_dir -lstack -Llib_dir -lmylib -o lib2_name -lcLinux では、以下のようになります (gcc コマンドは 1 行で入力する必要があります)。
cc -c ftable.c gcc -shared ftable.o application.o -Lstack_lib_dir -lstack -Llib_dir -lmylib -o lib2_nameWindows では、以下のようになります (link コマンドは 1 行で入力する必要があります)。
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 関数の呼び出し』を参照してください。