+ JNI(Java Native Interface) Part I
JNI(Java Native Interface)는 자바로 작성된 프로그램에서 C/C++ 로 만들어진 함수를 호출할 수
있게해준다. JNI는 주로 자바에서 하드웨어를 제어하기 위해서, 혹은 기존의 C/C++라이브러리를
재사용하기위해서 사용될 수 있다. 그러나 JNI를 사용하면플랫폼 간에 호환성이 떨어지고, 애플릿
에서 사용할수 없다는 단점이 있다. 이러한 단점에도 불구하고 자바언어의 장점을 가지고 하드웨어
에 접근하기 위한 방법으로 JNI는 매우 중요한 위치를 차지하는 것이 현실이다.
1. JNI 프로그래밍 단계
자바클래스 작성 -> 자바클래스 컴파일 -> javah 를 이용한 C언어 해더파일작성
-> 네이티브 메서드 작성 -> 라이브러리를 만든다 -> 프로그램 실행
2. JNI Example
예제 프로그램은 윈도우XP 프로페셔널 환경에서 jdk1.5, Visual C++ .NET 에서 작성되었으며,
프로그램은 자바에서 현재 하드디스크의 볼륨 시리얼을 읽어서 화면에 보여주는 간단한 예제이다.
JNI를 사용하기 위한 자바클레스를 작성한다.
----------------------------------------------------------------------------------------
* ExecuteJNI.java
class ExecuteJNI {
public static void main(String[] args)
{
new JNILoader().greet();
}
}
* JNILoader.java
class JNILoader {
public native void greet();
static {
System.loadLibrary("HardInfo");
}
}
----------------------------------------------------------------------------------------
javah를 이용해서 네이티브 메서드를 위한 C++해더파일을 생성한다.
> javah -jni JNILoader
----------------------------------------------------------------------------------------
* 생성된 JNILoader.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class JNILoader */
#ifndef _Included_JNILoader
#define _Included_JNILoader
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: JNILoader
* Method: greet
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_JNILoader_greet
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
----------------------------------------------------------------------------------------
JNILoader.java의 void greet() 메서드를 구현할 C++ 네이티브 메서드를 구현한다. C/C++ 컴파일
러는 UNIX에서 cc나 gcc, Win32에서 Turbo C나 Visual C++등을 쓸 수 있다. 참고로 여기서
구현한 것은 Visual C++로 구현된것이다.
----------------------------------------------------------------------------------------
* HardInfo.cpp
#include "stdafx.h"
#include "JNILoader.h"
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
JNIEXPORT void JNICALL Java_JNILoader_greet(JNIEnv *env, jobject obj) {
char cSerialNumber[16];
DWORD dwSerialNumber;
GetVolumeInformation("C:\\", NULL, 0, &dwSerialNumber, NULL, NULL, NULL, 0);
sprintf(cSerialNumber, "%8X", dwSerialNumber);
printf("===================================\n");
printf("= Volume SerialNumber, : %s =\n",cSerialNumber);
printf("===================================\n");
return;
}
----------------------------------------------------------------------------------------
HardInfo.dll 파일이 생성되었는가? 안된다고?...그...그럴수가...에러를 잡고 열심히 공부하자...
그럼 될 것이다...ㅡㅡ;;;
이제 준비가 된듯하니, 처음 만들었던 자바클래스 파일을 실행시켜보자.
두둥.....우리가 원하는 바데로 하드디스크 볼륨 시리얼 넘버를 읽어왔다....ㅡㅡv
사실 자바를 하면서도 JNI에 대해서 처음으로 셈플을 만들어봤다. 상당히 매력적이고 재밋지 않은
가? 단지 C/C++을 제법 알아야 한다는 테클이 걸려올 것이다. 하지만 무엇이 두려우랴...공부하자..
여러번의 시행착오를 겪다 보면 결국엔 성공할것이다. 화이또!!!
by kange
'Java' 카테고리의 다른 글
JAVA와 C 사용(JNI)시 데이터형 (0) | 2006.04.07 |
---|---|
JNI(Java Native Interface) Part II (0) | 2006.03.24 |
java.IO 클래스명에 사용된 단어의 의미 (0) | 2006.03.24 |