EGL 라이브러리를 통해 C 함수 호출
EGL 프로그램은 스테레오타입 nativeLibrary가 포함된 라이브러리 파트를 통해 C 함수를 호출할 수 있습니다.
- EGL 프로그램에서 사용할 C 함수를 식별하고 성공한 경우 0의 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 코드를 하나의 공유 라이브러리로 컴파일하고
적합한 플랫폼 특정 스택 라이브러리와 링크하십시오.
C 코드가 pop 외부 함수를 통해 EGL에서 값을 수신하여 리턴 외부 함수를 통해 EGL로 값을 리턴합니다.
모든 C 코드를 공유 라이브러리로 컴파일하려면 다음을 수행하십시오.- 표준 메소드를 사용하여 모든 C 코드를 하나의 공유 라이브러리로 컴파일하고 적합한 플랫폼 특정 EGL 스택 라이브러리와 링크하십시오.
- 다음 플랫폼 특정 예제에서 file1.c 및 file2.c는
EGL에서 호출된 함수가 포함된 C 파일입니다.AIX의 경우(ld 명령이 단일 행에 있어야 함) 다음과 같습니다.
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 명령이 단일 행에 있어야 함) 다음과 같습니다.cc -c -Iincl_dir file1.c file2.c gcc -shared file1.o file2.o -Lstack_lib_dir -lstack -o lib1_nameWindows의 경우(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- 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); /* Similar prototypes for other functions */ struct func_table ftab[] = { "c_fun1", c_fun1, "c_fun2", c_fun2, /* Similarly for other functions */ "", NULL };위의 예제에 기반한 함수 테이블을 작성하고 함수 테이블을 적합한 C 함수로 채우십시오. 함수 테이블의 끝을 "", NULL로 표시하십시오.
- 함수 테이블 및 적합한 플랫폼 특정 애플리케이션 오브젝트 파일을
공유 라이브러리로 컴파일하고 이 공유 라이브러리를
2단계에서 작성된 공유 라이브러리 및 스택 라이브러리와 링크하십시오.
애플리케이션 오브젝트 파일은 EGL 코드 및 C 코드 간의 인터페이스입니다.
다음 두 개의 아티팩트를 하나의 공유 라이브러리로 컴파일하고 위의 2단계에서 작성된 라이브러리 및 스택 라이브러리와 링크해야 합니다.- 함수 테이블
- 애플리케이션 오브젝트 파일
다음 예제를 통해 새 공유 라이브러리를 컴파일하십시오. 여기서 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 -lcLinux의 경우(gcc 명령이 단일 행에 있어야 함) 다음과 같습니다.
cc -c ftable.c gcc -shared ftable.o application.o -Lstack_lib_dir -lstack -Llib_dir -lmylib -o lib2_nameWindows의 경우(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 함수 호출을 참조하십시오.