JNI(Java Native Interface) 컴파일 및 실행방법

JNI(Java Native Interface)


컴파일 및 실행 방법


간단한 JNI예제를 만들어 보면서 설명을 하도록 한다.


HelloWorld.java 작성


우선 아래의 코드를 jnitest.java 파일로 만든 후 컴파일을 하도록 하자.



  1. import java.util.*;
  2. public class HelloWorld
  3. {
     native void print_test();    // C,Cpp함수를 호출하기 위해 선언
  4.  static{
      System.loadLibrary(“jnitest”);
     }
  5.  public static void main(String[] args)
     {
      HelloWorld jni = new HelloWorld();
  6.   jni.print_test();               // jni를 통해서 C, Cpp의 함수 호출
     }
    }

 아래의 명령으로 컴파일을 수행하면 jnitest.class 파일이 생성이 되는 것을 확인 할 수 있다.



  1. # javac HelloWorld.java

이제 C, Cpp에서 해당 함수를 구현할 수 있게 헤더파일을 만들어야 된다. 헤더파일 만드는 방법은 아래를 참고하자
결과적으로 jnitest.h 파일이 생성이 되는 것을 확인



  1.  javah -jni HelloWorld

HelloWorld.h 파일을 살펴보면 native void print_test()에 대응하는 함수가 선언이 되어있는 것을 확인할 수 있다.
이 파일에 있는 함수들을 C/Cpp에서 구현해 주면 되므로, 헤더파일은 수정하지 말도록 하자.



  1. /* DO NOT EDIT THIS FILE – it is machine generated */
    #include <jni.h>
    /* Header for class jnitest */
  2. #ifndef _Included_jnitest
    #define _Included_jnitest
    #ifdef __cplusplus
    extern “C” {
    #endif
    /*
     * Class:     jnitest
     * Method:    print_test
     * Signature: ()V
     */
    JNIEXPORT void JNICALL Java_jnitest_print_1test
      (JNIEnv *, jobject);
  3. #ifdef __cplusplus
    }
    #endif
    #endif

위 과정을 정상적으로 수행하면 아래의 두 파일이 생성이 되는 것을 확인할 수가 있다.



  1. HelloWorld.class HelloWorld.h

jnitest.c 작성


      이제 jnitest.h 파일에 선언이 되어있는 함수들을 구현하도록 하자.
      아래의 코드를 작성한 후 jnitest.c 파일로 저장하도록 하자.



  1. #include <stdio.h>
    #include <jni.h>
    #include “HelloWorld.h”
  2. JNIEXPORT void JNICALL Java_jnitest_print_1test(JNIEnv* env, jobject jobj)
    {
     printf(“Hello Wolrd…C -> java\n”);
    }

코드의 내용을 보면 알겠지만, Hello World를 출력하는 예제이다. 위의 형식으로 C, Cpp로 작성된 다른 함수들을 호출을 할 수 있다.


Complie and Run


위의 과정을 모두 거쳤으면, 4개의 파일이 생성이 되어야 된다.



  1. HelloWorld.java HelloWorld.class HelloWorld.h jnitest.cpp

JNI에서는 자바의 코드에서 C,Cpp로 작성된 라이브러리를 로드하여 호출하는 것이기 때문에  라이브러리를 만들어야 된다
windows계열에서는 dll, 유닉스 또는 리눅스 계열에서는 so 파일을 만들어 주어야 한다.
여기서는 Solaris기반으로 작업하는 것을 기준으로 하고 so 파일을 만드는 것으로 하겠다.


우선 jnitest.c 파일을 컴파일 후 so 파일을 만들도록 하자. 컴파일 및 라이브러리 생성은 아래를 참고하자.



  1. <C Version>
    cc -I$JDKHOME/include -I$JDKHOME/include/solaris -G jnitest.c -o libjnitest.so
  2. <C++ Version>
    CC -I$JDKHOME/include -I$JDKHOME/include/solaris -G jnitest.cpp -o libjnitest.so
  3. <g++ Version>
  4. g++ -c -fPIC -I$JAVA_HOME/include -I$JAVA_HOME/include/linux HelloNative.cpp
    g++ -shared -o libjnitest.so jnitest.o

    g++ -G -o libjnitest.so -I/usr/jdk/instances/jdk1.5.0/include -I/usr/jdk/instances/jdk1.5.0/include/solaris jnitest.cpp


$JDKHOME 부분이 설정이 되어있지 않을 경우 jdk가 설치되어있는 경로를 지정해 주면 된다.


추가적으로 라이브러리 경로를 지정해주어야 하는데 아래와 같이 하면 현재의 디렉토리를 라이브러리 경로로 추가하게 된다.



  1. # LD_LIBRARY_PATH=.
    # export LD_LIBRYRY_PATH

이제 실행해서 결과를 확인 하면 된다.



  1. # export LD_LIBRYRY_PATH
    # java jnitest

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다