본문 바로가기

개발 언어/JAVA

[JNI] 단계별 설명 (기본)

1단계: 자바 클래스 생성

 

public native void printHelloWorld()

- 키워드 native 선언

- 컴파일러에게 실제 이 메서드의 구현은 외부에 다른 언어로 구현 될 것이라는 것을 명시

 

System.loadLibray("helloworld")

- 실제로 Native Method와 연결을 위해서는 자바가상머신이 실제 Native method를 찾아서 실행 해 줄 수 있도록 Native Method가 구현되어 있는 라이브러리를 가져오는 작업

- C언어의 helloworld.dll을 만들고 이것을 자바 클래스로 로딩

- 라이브러기 동적 로딩

- 주의: 라이브러리는 Native Method가 호출 되기전에 반드시 로딩 되어야 함

 

HelloWorld.java(라이브러리를 로딩할 자바 파일)

public class HelloWorld {

   static {

     System.loadLibrary("helloworld");

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

   }

   public native void printHelloWorld();

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

       new HelloWorld().printHelloWorld();

   }

}

 

2단계: 자바 클래스 컴파일

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

- 헤더 파일은 jdk에 포함되어있는 javah 툴로 만듬

- javah HelloWorld

HelloWorld.class, HelloWorld.h 생성

- 이 헤더파일 안에는 HelloWorld 클래스에서 선언한 printHelloWorld()메서드 원형이 C의 문법으로 정의

 

 

 

HelloWorld.h(메서드의 원형이 정의되어있는 헤더 파일)

/* DO NOT EDIT THIS FILE - it is machine generated */

#include <jni.h>

/* Header for class HelloWorld */

 

#ifndef _Included_HelloWorld

#define _Included_HelloWorld

#ifdef __cplusplus

extern "C" {

#endif

/*

 * Class:     HelloWorld

 * Method:    printHelloWorld

 * Signature: ()V

 */

JNIEXPORT void JNICALL Java_HelloWorld_printHelloWorld (JNIEnv *, jobject);

 

#ifdef __cplusplus

}

#endif

#endif

 

-메서드 이름앞에 java_라는 접두사가 붙는다.

-클래스와 메서드를 구분해주는 ','(period)'_'(under scope)로 바뀐다.

-클래스는 패키지를 포함하여 전체 이름을 써준다.(: com_jabook_HelloWorld)

 

- JNIEnv * 은 실행 환경이 자바가상머신이라는 것이고 jobject는 클래스 자체

 

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

- 구현될 Native Method는 반드시 3단계에서 만들었던 HelloWorld.h 헤더 파일에 정의된 것과 같은 원형을 가져야 함

HelloWorld.c(메서드를 실행할 C 소스)

#include <jni.h>

#include "HelloWorld.h"

#include <stdio.h>

 

JNIEXPORT void JNICALL Java_HelloWorld_printHelloWorld (JNIEnv *env, jobject obj) {

   printf("Hello world!\n");

   return;

}

 

5단계: C컴파일러를 사용해서 라이브러리를 생성

- 윈도우: dll

- 리눅스: so

 

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

 

출처: http://blog.naver.com/kittenjun/10003051683


'개발 언어 > JAVA' 카테고리의 다른 글

[JNI] 배열혈 아규먼트  (0) 2011.07.22
[jni]객체의 메서드 실행하기  (0) 2011.07.22
[jni]객체 필드에 접근하기  (0) 2011.07.22
[jni]문자열 전달 인자  (2) 2011.07.22
[jni] 숫자 인자와 변환값  (0) 2011.07.22