EGL ライブラリー経由での C 関数の呼び出し

EGL プログラムでは、ステレオタイプが nativeLibrary のライブラリー・パーツを経由して、C 関数を呼び出すことができます。

EGL から C 関数を呼び出すための準備の手順は、次のとおりです。
  1. EGL プログラムで使用する C 関数を特定し、その関数が成功時に INT 型の値でゼロを返すことを確認する。
  2. EGL ランタイムをインストールし、スタック・ライブラリーとアプリケーション・オブジェクト・ファイルを見つける。
    1. EGL ランタイム・コードをインストールする。
    2. 対象となる以下のファイルを見つける。
      プラットフォーム固有のスタック・ライブラリーの場合
      • 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
  3. すべての C コードを 1 つの共用ライブラリーにコンパイルし、適切なプラットフォーム固有のスタック・ライブラリーにリンクする。

    C コードは、ポップ外部関数を使用して EGL から値を受け取り、戻り外部関数を使用して EGL に値を戻します。

    すべての C コードを共用ライブラリーにコンパイルする手順は、次のとおりです。
    1. 標準メソッドを使用して、すべての C コードを 1 つの共用ライブラリーにコンパイルし、適切なプラットフォーム固有の EGL スタック・ライブラリーにリンクする。
    2. 次のプラットフォーム固有の例では、file1.cfile2.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 -lc
      Linux では、以下のようになります (gcc コマンドは 1 行で入力する必要があります)。
      cc -c -Iincl_dir  file1.c file2.c
      gcc -shared file1.o file2.o -Lstack_lib_dir
          -lstack -o lib1_name

      Windows では、以下のようになります (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 ライブラリーにもリンクする必要があります。
  4. 関数テーブルを作成する。

    関数テーブルとは、EGL プログラムから呼び出されるすべての C 関数の名前を含む C ソース・ファイルです。 次の関数テーブル例では、c_fun1c_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 で関数テーブルの終わりを示します。

  5. この関数テーブルと適切なプラットフォーム固有のアプリケーション・オブジェクト・ファイルを共用ライブラリーにコンパイルし、この共用ライブラリーを、ステップ 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 -lc

    Linux では、以下のようになります (gcc コマンドは 1 行で入力する必要があります)。

    cc -c  ftable.c
    gcc -shared ftable.o application.o 
        -Lstack_lib_dir -lstack -Llib_dir 
        -lmylib -o lib2_name

    Windows では、以下のようになります (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 関数の呼び出し』を参照してください。


フィードバック