JNI & 예제

Posted by ironmask84
2013. 4. 1. 14:27 나는 프로그래머다!/Java & Android


JNI는 요 근래에 알개 되었다. C언의 요소들을 자바에서 사용하고자해서 찾아보것이 알개 된계기
JNI는 자바에서 C/C++로 구현되거나 자바에 비해 장점이라 할수 있는 것들을 사용할수 있개 해주는 것이다.

 native method라는 것을 구현화 함으로 C와 C++의 문법적 요소들을 가져와 쓰는 것이다.
이러한 장점에 비해 자바의 강점인 이식성과 네이티브 메소드들의 자바의  메소드들과 같은 보호를 장담하지 못한다는 단점이 있다.

 자료를 수집하려 들려본 블로그, 카페들 중에서는 이론상으로 C로 구현된 것들(API)을 모두 가져다 쓸수 있다고 표현한 분들도 있었지만 해보지 않아 장담할 수없어 아쉽다.

 첫 단계로 "Hello World"예제를 만드는 법을 설명하갰다.
테스트 환경은 윈도우 2003 R2, 자바 1.6  비쥬얼스트디오 6.0에서 하였다.

 먼저 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();
 }
}
=============================================================

위에서 static이라 구현해 준 부분은 자바소스가 실행될때 HelloWorld라는 라이브러리를 가져다 쓰갰다는 이야기가 된다.

 그리고 public native void printHelloWorld() 이부분이 C에서 구현해주고 사용할 메소드,함수의 선언 부분이다.

 위의 소스가 준비가 됬다면 이제는 javac 와 javah로 컴파일과 해더파일을 작성해주면 된다. 컴파일이 먼저 이루어져야 하겠고 javah뒤에는 확장자를 뺀 클래스 파일의 이름을 넣어 주면 된다.

위 그림과 같이 되갰으며 아무 매세지가 나오지 않으면 성공한것이다.


그럼 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
=============================================================

 javah로 만들어준 해더 파일이다. 이파일은 수정하면 안되며 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;
}
=============================================================

 이것이 c언어로 구현해 주어야 할 부분이다.
이소스는 비쥬얼 스트디오에서 DLL을 만들어주는 프로젝트를 만들어야 한다.
일단 jni.h파일과 만들어준 HelloWorld.h 파일을 인클루드해야 한다.
jni.h는 자바가 설치된 디렉토리 및에 있으며 비쥬얼 스트디오에서는 라이브러리 추가를 해주어야 한다.

 함수의 명은 Java_클래스명_자바에서 선언한 네이티브메소드명 이 되갰다.
이제 이소스를 DLL파일로 만들어 주었으면 작업공간의 가장 상위 폴더로 옯겨준다.

이제 실행을 해보자


이와 같은 결과가 나올것이다.

출처 : http://blog.naver.com/sysganda/30095941540