Java 프로그램에서 C, C++언어로 생성한 DLL을 로드하고 포함된 함수를 호출하는 예
JNI Reference : http://download.oracle.com/javase/1.4.2/docs/guide/jni/spec/functions.html#wp17314
작성순서
2. JDK/bin/javah.exe 를 이용한 헤더파일(*.h) 파일 생성 (HelloJNI.h)
3. 헤더파일(jni.h, HelloJNI.h)을 포함하는 C 혹은 C++ 소스파일 작성/Build (my_dll.dll);
4. 자바 클래스 실행/DLL 내의 함수가 성공적으로 호출되었는지 확인
준비물
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에 등록하는 절차는 다음과 같다.
메뉴에서 도구 >옵션 을 선택하면 나타나는 설정창에서 다음 그림과 같이 설정하면 된다.