EGL 程序可调用 C 函数。
要从 EGL 调用 C 函数:
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. 创建函数表
函数表是一个 C 源文件,该源文件包括要从 EGL 程序调用的所有 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); /* Similar prototypes for other functions */ struct func_table ftab[] = { "c_fun1", c_fun1, "c_fun2", c_fun2, /* Similarly for other functions */ "", 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
将三个库链接在一起。
使用 C 共享库、函数表和链接的堆栈库,您就可以从 EGL 代码调用 C 函数了。有关如何在 EGL 中调用 C 函数的信息,请参阅从 EGL 程序调用 C 函数。