* JNI(Java Native Interface)
    - 속도빠른 루틴, 하드웨어제어
    - 다루기 힘들고, 불안정
    재생산이나 디버그가 어렵다
    이식성 상실
    - 안드로이드 Dalvik VM 에서 지원


    - JNI 예제

//===================
// 자바 소스 - Test1.java
 public class Test1  {
     public static void main(String[] args)  throws IOException  {
         JniLib1 jni1 = new JniLib1();
         JniLib1.prt(132);
     }
 }

// JNI를 위한 클래스
 class JniLib1{
     //JNI
     static{
         //DLL 로드
         System.load("D:\\IdeaProjects\\J_Hello\\src\\JniLib1.dll");
     }

     //함수 선언
     public native int prt(int num);
     public native int MsgBox(String str);
 }



//===================
// C 헤더 파일 - JniLib1.h
#include <jni.h>

#ifndef _Included_JniLib1
#define _Included_JniLib1
#ifdef __cplusplus
extern "C" {
#endif

    JNIEXPORT int JNICALL Java_JniLib1_prt(JNIEnv *, jobject, jint);
    JNIEXPORT int JNICALL Java_JniLib1_MsgBox(JNIEnv *env, jobject obj, jstring msg);

#ifdef __cplusplus
}
#endif
#endif


//===================
// C 소스 파리  - JniLib1.c

#include "jni.h"
#include "jni_md.h"

#include "JniLib1.h"

#include <stdio.h>
#include <windows.h>

#pragma comment(lib, "user32")

JNIEXPORT int JNICALL Java_JniLib1_prt(JNIEnv *env, jobject obj, jint value)
{
    printf("%d\n", value);       
    return value;
}

JNIEXPORT int JNICALL Java_JniLib1_MsgBox(JNIEnv *env, jobject obj, jstring msg)
{       
    int ret = 0;

    const jchar * jstr = (*env)->GetStringChars(env, msg, NULL); 
    MessageBoxW(NULL, (const wchar_t*)jstr, L"Title",MB_OK|MB_TOPMOST);//
    (*env)->ReleaseStringChars(env, msg, jstr);//         
   
    return ret;
}



//===================
    - 자바 컴파일
> javac.exe  -encoding UTF-8 Test1.java


    - 헤더파일 복사
    jni.h, jni_md.h 파일을 비주얼 스튜디오 include폴더로 복사

> c:
> cd "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include"
copy "C:\Program Files\Java\jdk1.8.0_40\include\jni.h"  .
copy "C:\Program Files\Java\jdk1.8.0_40\include\win32\jni_md.h"  .


    - C 컴파일
> "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat"

>  cl -LD JniLib1.c
    -> JniLib1.dll 파일 생성

    - 실행
> java Test1


//====================================
    - 에러 처리 : JRE가 64bit라서 생기는 문제
Exception in thread "main" java.lang.UnsatisfiedLinkError: D:\IdeaProjects\JNI2\src\JniLib1.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform
        at java.lang.ClassLoader$NativeLibrary.load(Native Method)
        at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1937)
        at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1855)
        at java.lang.Runtime.loadLibrary0(Runtime.java:870)
        at java.lang.System.loadLibrary(System.java:1122)
        at JniLib1.<clinit>(Test1.java:8)


        - 해결 방법 1 : C 파일을 64bit로 컴파일 한다
            visual studio 64bit compile command line
> "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\amd64\vcvars64.bat"
> cl.exe -LD JniLib1.c

        - 해결 방법 2 :
            32bit JRE를 설치한다.
            실행시 -d32 옵션을 준다
> java -d32  Test1


Posted by 코덴스
TAG ,

댓글을 달아 주세요