강좌

HOME > 강좌 >
강좌| 리눅스 및 오픈소스에 관련된 강좌를 보실 수 있습니다.
 
JNI ( JAVA Native Interface )
조회 : 6,730  







JNI ( JAVA Native Interface )








ㅇ 제작 : 리눅스포털(www.superuser.co.kr) 수퍼유저코리아 개발팀 이재석


SULINUX 홈페이지 : www.sulinux.net


ㅇ 리눅스포털 홈페이지 : www.superuser.co.kr


  1. JNI ( JAVA Native Interface ) ?

자바로 만들어진 프로그램에서 특정 플랫폼에서만 실행되는 코드

(Native Code)에 접근하기 위한 API이다.


Native code를 생성하는 다른 언어와 함께 공동작업을 하거나

하드웨어어 보다 깊게 접근하여 컨트롤도 가능하지만

플랫폼이 제한된다는 단접이 있다.


  1. 사용방법 및 코드 작성법


1단계 : Native Method를 선언하는 자바 클래스 작성

2단계 : 1단계에서 작성한 클래스 컴파일

3단계 : javah를 사용해서 Native Method가 사용할 헤더 파일 생성

4단계 : C언어로 Native Method 실제 구현

5단계 : C 코드와 헤더 파일을 컴파일

6단계 : 자바 프로그램 실행



위에서 보는것 처럼 6단계로 나누어 작업을 하게 된다.



1단계 : Native Method를 선언하는 자바 클래스 작성



public class tt {

  static {
      //
시스템 라이브러리 로드(so,dll)
      System.loadLibrary("tt");

      System.out.println("=== library was loaded");

  }

  //native method 선언
  public native String main1();
  public native String main2();

  public static void main(String[] args)  throws Exception {

      mains1();
      mains2();

  }

  public static String mains1()  throws Exception {

      return new tt().main1();

  }

  public static String mains2()  throws Exception {

      return new tt().main2();

  }

}





2단계 : 1단계에서 작성한 클래스 컴파일



javac tt.java





3단계 : javah를 사용해서 Native Method가 사용할 헤더 파일 생성



javah tt





4단계 : C언어로 Native Method 실제 구현



#include <jni.h>
#include "tt.h"
#include <stdio.h>

JNIEXPORT jstring JNICALL Java_tt_main1(JNIEnv *, jobject)
{
   printf("Hello, world ");

   return 0;
}

JNIEXPORT jstring JNICALL Java_tt_main2(JNIEnv *, jobject)
{
   printf("Hello, world1 ");

   return 0;
}





5단계 : C 코드와 헤더 파일을 컴파일



vc   : cl -Ic:jdk1.3.1include -Ic:jdk1.3.1includewin32 -LD HelloWorld.c


gcc  : cc –G –I/usr/local/java/include –I/usr/local/java/include/solaris HelloWorld.c –o libhelloworld.so



6단계 : 자바 프로그램 실행



java tt

=== library was loaded
Hello, world
Hello, world1





3. JAVA에서 Native code로 파라메타 넘겨주기


JAVA SOURCE


public class Test {

  public native String maint(String msg);

    static {
        System.loadLibrary("Test");
    }

}


NATIVE SOURCE

#include <jni.h>
#include "Test.h"
#include "NativeStringUtil.h"

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

JNIEXPORT jstring JNICALL
Java_Test_maint(JNIEnv *env, jobject obj, jstring str)
{
    char buf[1024];
    char *str;
    str1 = jbyteArray2str1( env, javaGetBytes(env, str) );
    sprintf(buf, "%s:%s", str1, "반가워요 이건 C함수에서 넘겨준 겁니다.");
    return javaNewString( env, cstr2jbyteArray(env, buf));
}



            java에서 public native String maint(String msg)
            여기서 넘어온 스트링값을  Native code에서
            str1 = jbyteArray2str1( env, javaGetBytes(env,
            str) ); 위와 같은  방식으로  받아온다.


       4. 마치며

           앞에서도 언급 하였듯이 java에서 직접 네이티브 코드를 호출하여 
           이용할 수 있다.

           네이티브 코드를 생상할수 있는 다른 언어와도 협업작업이 쉬워지고 
           아키텍쳐에 따른 하드웨어 콘트롤 역시 가능하며 
 
            메모리 컨트롤이나 CPU컨트롤시 보다 디테일 하게 컨트롤이 가능하다

           하지만 Native code를 생산하고 이용하게 됨으로 
           특정 아키텍쳐나 플랫폼에 종속될수 밖에 없고 
           다양한 플랫폼을 지원 하려면 그많큼 수고로울수 밖에 없다 .
           
           보는바와 같이 장단점을 잘 숙지해야 하겠다. 
                       

[원글링크] : https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=1390


이 글을 트위터로 보내기 이 글을 페이스북으로 보내기 이 글을 미투데이로 보내기

 
이재석
본명 : 이재석
e-mail : locli앳superuser.co.kr
소속 : (주)수퍼유저코리아