Java

JNI(Java Native Interface) Part I

_침묵_ 2006. 3. 24. 08:44

+ 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