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