EGL 라이브러리를 통해 C 함수 호출

EGL 프로그램은 스테레오타입 nativeLibrary가 포함된 라이브러리 파트를 통해 C 함수를 호출할 수 있습니다.

다음 단계에 따라 EGL에서 C 함수 호출 준비를 하십시오.
  1. EGL 프로그램에서 사용할 C 함수를 식별하고 성공한 경우 0의 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 코드를 하나의 공유 라이브러리로 컴파일하고 적합한 플랫폼 특정 스택 라이브러리와 링크하십시오.

    C 코드가 pop 외부 함수를 통해 EGL에서 값을 수신하여 리턴 외부 함수를 통해 EGL로 값을 리턴합니다.

    모든 C 코드를 공유 라이브러리로 컴파일하려면 다음을 수행하십시오.
    1. 표준 메소드를 사용하여 모든 C 코드를 하나의 공유 라이브러리로 컴파일하고 적합한 플랫폼 특정 EGL 스택 라이브러리와 링크하십시오.
    2. 다음 플랫폼 특정 예제에서 file1.cfile2.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 -lc
      Linux의 경우(gcc 명령이 단일 행에 있어야 함) 다음과 같습니다.
      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
      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);
    /* Similar prototypes for other functions */
    
    struct func_table ftab[] =
                {
                     "c_fun1", c_fun1,
                     "c_fun2", c_fun2,
                     /* Similarly for other functions */
                     "", NULL
                };  

    위의 예제에 기반한 함수 테이블을 작성하고 함수 테이블을 적합한 C 함수로 채우십시오. 함수 테이블의 끝을 "", NULL로 표시하십시오.

  5. 함수 테이블 및 적합한 플랫폼 특정 애플리케이션 오브젝트 파일을 공유 라이브러리로 컴파일하고 이 공유 라이브러리를 2단계에서 작성된 공유 라이브러리 및 스택 라이브러리와 링크하십시오.

    애플리케이션 오브젝트 파일은 EGL 코드 및 C 코드 간의 인터페이스입니다.

    다음 두 개의 아티팩트를 하나의 공유 라이브러리로 컴파일하고 위의 2단계에서 작성된 라이브러리 및 스택 라이브러리와 링크해야 합니다.
    • 함수 테이블
    • 애플리케이션 오브젝트 파일

    다음 예제를 통해 새 공유 라이브러리를 컴파일하십시오. 여기서 ftable.c는 함수 테이블의 이름이고 mylib는 2단계에서 작성된 C 공유 라이브러리의 이름이며 lib_dirmylib의 디렉토리 위치입니다. 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 함수 호출을 참조하십시오.