본문 바로가기

J N I/Hello JNI example

Hello JNI example

Java 프로그램에서 C, C++언어로 생성한 DLL을 로드하고 포함된 함수를 호출하는 예
JNI Reference : http://download.oracle.com/javase/1.4.2/docs/guide/jni/spec/functions.html#wp17314

작성순서

1. native 키워드를 가진 메소드를 포함하는 Java 클래스 작성/컴파일 (HelloJNI.java)
2. JDK/bin/javah.exe 를 이용한 헤더파일(*.h) 파일 생성 (HelloJNI.h)
3. 헤더파일(jni.h, HelloJNI.h)을 포함하는 C 혹은 C++ 소스파일 작성/Build (my_dll.dll);
4. 자바 클래스 실행/DLL 내의 함수가 성공적으로 호출되었는지 확인



준비물

JDK, 자바 에디터, JDK/include/jni.h, JDK/include/win32/jni_md.h
C 컴파일러 (여기서는 Visual Studio 2008 Express Edition 을 사용함)



작성내용
1. native 키워드를 가진 메소드를 포함한 자바 클래스를 작성하고 컴파일한다.

HelloJNI.java

//HelloJNI.java
public class HelloJNI {
   static{
      System.loadLibrary("my_dll");  
   }
   public native void printHello(); /* 메소드의 내용은 C 언어에서 정의할 예정 */

   public static void main(String[] args) throws Exception{
      new HelloJNI().printHello();
   }
}


2. Native 메소드는 C언어에서 구현할 예정이므로 해당 함수의 원형을 선언한 헤더파일(HelloJNI.h)을 생성한다
명령행에서 다음과 같이 명령한다.

C:\>javah HelloJNI<enter>

이 명령으로 HelloJNI.h 헤더파일이 생성되었고 이 파일에는 C언어에서 정의해야 할 함수의 원형이 선언되어 있다.
그리고 이 헤더파일에는 jni.h 를 포함하는 부분이 있는데, jni.h 헤더파일은 JDK/include/ 안에 있으므로 C 에디터에 이 경로를 include 경로로 등록해야 C언어 에디터에서 접근이 가능하다. jni.h 파일에서는 jni_md.h 파일도 포함해야 하므로 이 파일의 경로(JDK/include/win32)도 C 언어 에디터에 등록해야 컴파일시에 오류가 발생하지 않는다.


HelloJNI.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloJNI */

#ifndef _Included_HelloJNI
#define _Included_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloJNI
 * Method:    printHello
 * Signature: ()V
 */

JNIEXPORT void JNICALL Java_HelloJNI_printHello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif






3. 위에서 생성한 헤더파일을 포함한 C 언어 소스파일을 작성하고 컴파일/Build 한다.
위의 헤더파일에 선언된 함수의 원형 그대로 선언하고 함수의 내용을 정의해야 한다.

#include "HelloJNI.h"
#include <stdio.h>

JNIEXPORT void JNICALL Java_HelloJNI_printHello (JNIEnv * env, jobject obj){
   printf("Hello World!\n"); /* C언어를 사용하여 함수의 내용을 정의한다 */
   return;
}



4. 위에서 Build결과 생성된 DLL파일의 이름을 my_dll.dll 으로 고쳐서 자바 클래스가 위치한 곳에 복사한다.
그리고 HelloJNI 클래스를 실행하여 화면의 출력문을 확인한다.


참고: Visual Studio 2008 Express Edition (VS2008 EE) 에서 DLL 파일을 생성하기 위한 프로젝트 설정

VS 2008 EE 실행 > 파일 > 새로 만들기 > 프로젝트 > Visual C++ > Win32 콘솔 응용 프로그램 > 프로젝트 이름 입력 > 확인 > 다음 > DLL선택, 빈 프로젝트 선택 > 마침

위에서 생성된 프로젝트는 VS2008 EE의 왼쪽 [솔수션 탐색기]에 보이는데, [프로젝트] 항목 아래에 [헤더파일] 을 마우스우측으로 클릭하여 추가 > 새항목 > Visual C++ > 헤더파일 선택, 이름 입력 > 추가

여기까지 하면 빈 헤더파일이 VS2008 EE에 나타나는데, 위에서 생성된 HelloJNI.h 파일의 내용을 복사해서 붙여넣기 하면 된다.

JDK/include/win32 안에 포함된 JNI 프로그래밍용 헤더파일의 경로를 VS2008 EE에 등록하는 절차는 다음과 같다.
메뉴에서 도구 >옵션 을 선택하면 나타나는 설정창에서 다음 그림과 같이 설정하면 된다.