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 |