C-Funktionen über EGL-Bibliotheken aufrufen
EGL-Programme können C-Funktionen über Bibliotheksabschnitte mit dem Stereotyp nativeLibrary aufrufen.
- 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.
- Installieren Sie die EGL-Laufzeiten und suchen Sie nach der Stackbibliothek sowie der Anwendungsobjektdatei:
- Installieren Sie den EGL-Laufzeitcode.
- 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
- 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:- 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.
- 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 -lcLinux (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_nameWindows (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. - 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.
- 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 -lcLinux (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_nameWindows (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_nameVerknü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.