* 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 |