* 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


반응형

'Code > Mobile' 카테고리의 다른 글

다른 OS용 앱을 윈도우용으로 변환  (0) 2015.08.09
Genymotion 사용법  (4) 2015.06.01
Java GUI (AWT, Swing) 프로그래밍  (0) 2015.04.03
자바(Java) 기본 정보  (0) 2015.03.25
안드로이드 프로그래밍 시작하기  (0) 2015.03.20
Posted by codens


반응형