C-Funktionen über EGL-Bibliotheken aufrufen

EGL-Programme können C-Funktionen über Bibliotheksabschnitte mit dem Stereotyp nativeLibrary aufrufen.

Gehen Sie folgendermaßen vor, um den Aufruf einer C-Funktion aus EGL zu erstellen:
  1. Geben Sie die C-Funktionen an, die in Ihrem EGL-Programm verwendet werden sollen, und stellen Sie sicher, dass sie bei Erfolg einen ganzzahligen Wert (Typ INT) Null zurückgeben.
  2. Installieren Sie die EGL-Laufzeiten und suchen Sie nach der Stackbibliothek sowie der Anwendungsobjektdatei:
    1. Installieren Sie den EGL-Laufzeitcode.
    2. Suchen Sie die betreffenden Dateien:
      Für plattformspezifische Stackbibliotheken:
      • AIX: EGLRuntimes/Aix/bin/libstack.so
      • Linux: EGLRuntimes/Linux/bin/libstack.so
      • 32-Bit-Windows-Plattformen:
        • EGLRuntimes/Win32/bin/stack.dll
        • EGLRuntimes/Win32/bin/stack.lib
      Für plattformspezifische Anwendungsobjektdateien:
      • AIX: EGLRuntimes/Aix/bin/application.o
      • Linux: EGLRuntimes/Linux/bin/application.o
      • 32-Bit.Windows-Plattformen: EGLRuntimes/Win32/bin/application.obj
  3. Kompilieren Sie den gesamten C-Code in einer einzigen gemeinsam genutzten Bibliothek und stellen Sie eine Verknüpfung mit der entsprechenden plattformspezifischen Stackbibliothek her.

    Ihr C-Code empfängt Werte aus EGL mit externen Abruffunktionen und gibt Werte mit externen Rückgabefunktionen an EGL zurück.

    Gehen Sie folgendermaßen vor, um den gesamten C-Code in einer gemeinsam genutzten Bibliothek zu kompilieren:
    1. Kompilieren Sie den gesamten C-Code mit den Standardverfahren in einer einzigen gemeinsam genutzten Bibliothek und verknüpfen Sie sie mit der entsprechenden plattformspezifischen EGL-Stackbibliothek.
    2. In den folgenden plattformspezifischen Beispielen handelt es sich bei den Dateien file1.c und file2.c um C-Dateien, die aus EGL aufgerufene Fuktionen enthalten.
      AIX (der Befehl ld muss in einer einzigen Zeile eingegeben werden):
      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 (der Befehl gcc muss in einer einzigen Zeile eingegeben werden):
      cc -c -Iincl_dir  file1.c file2.c
      gcc -shared file1.o file2.o -Lstack_lib_dir
          -lstack -o lib1_name

      Windows (der Befehl link muss in einer einzigen Zeile eingegeben werden):

      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
      Die Verzeichnisposition für die Headerdateien.
      stack_lib_dir
      Die Verzeichnisposition für die Stackbibliothek.
      lib1_name
      Der Name der Ausgabebibliothek.
    Anmerkung: Falls Ihr C-Code eine der Bibliotheksfunktionen von IBM® Informix ESQL/C verwendet (BIGINT, DECIMAL, DATE, INTERVAL, DATETIME), muss auch die ESQL/C-Bibliothek verknüpft werden.
  4. Erstellen Sie eine Funktionstabelle.

    Die Funktionstabelle ist eine C-Quellendatei, in der die Namen aller C-Funktionen enthalten sind, die aus dem EGL-Programm aufgerufen werden sollen. Im folgenden Beispiel für die Funktionstabelle sind c_fun1 und c_fun2 Namen von C-Funktionen. Alle im Code angegebenen Funktionen müssen aus der gemeinsam genutzten C-Bibliothek, die in einem vorherigen Schritt erstellt wurde, exportiert worden sein.

    #include <stdio.h>
    struct func_table {
    
          char *fun_name;
          int (*fptr)(int); 
    };
    
    extern int c_fun1(int);
    extern int c_fun2(int);
    /* Similar prototypes for other functions */
    
    struct func_table ftab[] =
                {
                     "c_fun1", c_fun1,
                     "c_fun2", c_fun2,
                     /* Similarly for other functions */
                     "", NULL
                };  

    Erstellen Sie anhand des obigen Beispiels eine Funktionstabelle und füllen Sie die Funktionstabelle mit den entsprechenden C-Funktionen. Geben Sie das Ende der Funktionstabelle mit "", NULL an.

  5. Kompilieren Sie die Funktionstabelle und die entsprechende plattformspezifische Anwendungsobjektdatei in einer gemeinsam genutzten Bibliothek und verknüpfen Sie diese gemeinsam genutzte Bibliothek mit der gemeinsam genutzten Bibliothek, die Sie in Schritt 2 erstellt haben, sowie der Stackbibliothek.

    Die Anwendungsobjektdatei ist die Schnittstelle zwischen dem EGL-Code und dem C-Code.

    Die folgenden beiden Artefakte müssen in einer gemeinsam genutzten Bibliothek kompiliert und mit der Stackbibliothek sowie der in Schritt 2 erstellten Bibliothek verknüpft werden:
    • Funktionstabelle
    • Anwendungsobjektdatei

    Kompilieren Sie die neue gemeinsam genutzte Bibliothek anhand des folgenden Beispiels. Hierbei ist ftable.c der Name der Funktionstabelle und mylib der Name der gemeinsam genutzten C-Bibiliothek, die in Schritt 2 erstellt wurde. lib_dir ist die Verzeichnisposition für mylib. Geben Sie den Wert für lib2_name mit der Eigenschaft dllName oder der Java™-Laufzeiteigenschaft vgj.defaultI4GLNativeLibrary an.

    AIX (der Befehl ld muss in einer einzigen Zeile eingegeben werden):

    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 (der Befehl gcc muss in einer einzigen Zeile eingegeben werden):

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

    Windows (der Befehl link muss in einer einzigen Zeile eingegeben werden):

    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

    Verknüpfen Sie die drei Bibliotheken miteinander.

Sobald die gemeinsam genutzte C-Bibliothek, die Funktionstabelle und die Stackbibliothek miteinander verknüpft wurden, können Sie die C-Funktionen aus dem EGL-Code aufrufen. Informationen zum Aufrufen einer C-Funktion in EGL finden Sie unter C-Funktion aus einem EGL-Programm aufrufen.


Feedback