μλ° λ€μ΄ν°λΈ μΈν°νμ΄μ€λ μλ° κ°μλ¨Έμ (JVM)μμμ μ€νλκ³ μλ μλ°μ½λκ° λ€μ΄ν°λΈ μμ© νλ‘κ·Έλ¨(νλμ¨μ΄μ μ΄μ 체μ νλ«νΌμ μ’ μλ νλ‘κ·Έλ¨λ€) κ·Έλ¦¬κ³ C, C++ κ·Έλ¦¬κ³ μ΄μ λΈλ¦¬ κ°μ
λ€λ₯Έ μΈμ΄λ€λ‘ μμ±λ λΌμ΄λΈλ¬λ¦¬λ€μ νΈμΆνκ±°λ λ°λλ‘ νΈμΆλλ κ²μ κ°λ₯νκ² νλ νλ‘κ·Έλλ° νλ μμν¬
β μ΄λ₯Ό λ¬μ±νκΈ° μν΄ JDKλ JVMμμ μ€νλλ λ°μ΄νΈμ½λμ κΈ°λ³Έμ½λ μ¬μ΄μ λΈλ¦¬μ§λ₯Ό λμ
Javaλ λ©μλ ꡬνμ΄ λ€μ΄ν°λΈ μ½λμμ μ 곡λ κ²μμ λνλ΄λ λ° μ¬μ©λλ λ€μ΄ν°λΈ ν€μλλ₯Ό μ 곡
μΌλ°μ μΌλ‘ λ€μ΄ν°λΈ μ€ν νλ‘κ·Έλ¨μ λ§λ€ λ μ μ λλ 곡μ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©ν μ μλ€.
μ μ λΌμ΄λΈλ¬λ¦¬ - λͺ¨λ λΌμ΄λΈλ¬λ¦¬ λ°μ΄λ리λ μ°κ²° νλ‘μΈμ€ λμ μ€ν νμΌμ μΌλΆλ‘ ν¬ν¨. λ°λΌμ libsλ λ μ΄μ νμνμ§ μμ§λ§ μ€ν νμΌμ ν¬κΈ°κ° μ¦κ°
곡μ λΌμ΄λΈλ¬λ¦¬ - μ΅μ’ μ€ν νμΌμλ μ½λ μμ²΄κ° μλ λΌμ΄λΈλ¬λ¦¬μ λν μ°Έμ‘°λ§ μλ€. μ€ν νμΌμ μ€ννλ νκ²½μ΄ νλ‘κ·Έλ¨μμ μ¬μ©νλ libsμ λͺ¨λ νμΌμ μ‘μΈμ€ν μ μμ΄μΌ νλ€.
곡μ λΌμ΄λΈλ¬λ¦¬
λ λ°μ΄νΈ μ½λμ κ³ μ νκ² μ»΄νμΌλ μ½λλ₯Ό λμΌν λ°μ΄λ리 νμΌμ νΌν©ν μ μκΈ° λλ¬Έμ JNIμ λν΄ μλ―Έκ° μλ€.
λ°λΌμ 곡μ λΌμ΄λΈλ¬λ¦¬λ ν΄λμ€μ μΌλΆκ° μλ
.so
.dll
.dylib
νμΌ λ΄μ λ€μ΄ν°λΈ μ½λλ₯Ό λ³λλ‘ λ³΄κ΄
β μλ° μ½λ
β λ€μ΄ν°λΈ μ½λ
β JNI ν€λ νμΌ
β C/C++ μ»΄νμΌλ¬
java Code
λ€μ΄ν°λΈ ν€μλ - λ€μ΄ν°λΈλ‘ νμλ λͺ¨λ λ©μλλ λ€μ΄ν°λΈ 곡μ λΌμ΄λΈλ¬λ¦¬μμ ꡬνλμ΄μΌ νλ€.
System.loadLibrary(String libname) - 곡μ λΌμ΄λΈλ¬λ¦¬λ₯Ό νμΌ μμ€ν μμ λ©λͺ¨λ¦¬λ‘ λ‘λνκ³ λ΄λ³΄λΈ ν¨μλ₯Ό Java μ½λμμ μ¬μ©ν μ μλλ‘ νλ μ μ λ©μλ
C/C++ Code
JNIEXPORT - ν¨μλ₯Ό 곡μ λΌμ΄λΈλ¬λ¦¬μ λ΄λ³΄λ΄κΈ° κΈ°λ₯μΌλ‘ νμνμ¬ ν¨μ ν μ΄λΈμ ν¬ν¨λλ―λ‘ JNIκ° μ°Ώμ μ μλ€.
JNICALL - JNIEXPORTμ κ²°ν© νμ¬ JNI νλ μμν¬μμ λ©μλλ₯Ό μ¬μ©ν μ μλλ‘ νλ€.
JNIEnv - λ€μ΄ν°λΈ μ½λλ₯Ό μ¬μ©νμ¬ Java μμμ μ‘μΈμ€ν μ μλ λ©μλκ° ν¬ν¨λ ꡬ쑰
JavaVM - μ€ν μ€μΈ JVMμ μ‘°μν μ μλ ꡬ쑰(λλ μ JVM μμ)μ Threadλ₯Ό run/interrupt... λ±λ±
Cλ‘ μμ±λ μ½λμμ μνλ λ©μλλ₯Ό μ μνλ λ¨κ³
μλ₯Ό λ€μ΄ "Hello World"λΌλ λ©μμ§λ₯Ό μΆλ ₯νλ λ€μ΄ν°λΈ ν¨μκ° νμνλ€λ©΄, λ€μκ³Ό κ°μ΄ μ½λ©νλ€.
public native void getHello();
static{
System.loadLibrary("JNI_Hello");
}
첫 Lineμ λ©μλλ₯Ό μ μΈν λ 'native' ν€μλλ₯Ό μ¬μ©νλ€.
μ΄λ κ² μ μΈνλ©΄ getHello()κ° νΈμΆλ λ μλ°κ° μλ λ€μ΄ν°λΈλ‘ ꡬνλ λ©μλλ₯Ό μ°Ύκ² λλ€.
κ·Έ λ€μ Lineμ λ€μ΄ν°λΈλ‘ μμ±λ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ§μ νλ ꡬ문μ΄λ€.
μ¬κΈ°μλ JNI_Hello.dll μ΄λΌλ λΌμ΄λΈλ¬λ¦¬λ₯Ό λ‘λ©νκ³ μλ€.
public class Hello{
public native void getHello();
static{
System.loadlibrary("JNI_Hello");
}
public Hello(){
getHello();
}
public static void main(String[] args){
new Hello();
}
}
μμ±λ Hello.classλ₯Ό javah.exe νλ‘κ·Έλ¨μ μ΄μ©ν΄μ Hello.class νμΌλ‘λΆν° C ν€λνμΌμ μμ±
# μλμ° cmdλ₯Ό μ΄μ©νμ¬ command μ
λ ₯
# 1. μμ±ν νλ‘μ νΈμ bin ν΄λλ‘ μ΄λ
cd ~~~/Project_Name/bin
# 2. javah command μ
λ ₯
javah packagename.filename
μ§νμ΄ μλ£ λλ©΄ λ€μκ³Ό κ°μ ν€λνμΌμ΄ μμ±λλ€.
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class simple_Hello */
#ifndef _Included_simple_Hello
#define _Included_simple_Hello
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: simple_Hello
* Method: getHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_simple_Hello_getHello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
μ΄ ν€λνμΌμ Cλ‘ μ½λ©ν λ κ·Έλλ μ¬μ©νκ³
μ€κ°μ μ μΈλ
JNIEXPORT void JNICALL Java_simple_Hello_getHello(JNIEnv *, jobject);
λ©μλλ₯Ό ꡬν ν κ²μ΄λ€.
(μ΄λ¦μ 보면 Javaλ‘ μμνκ³ ν¨ν€μ§
-ν΄λμ€
-λ©μλ
μ΄λ¦ μμΌλ‘ μλμμ± λμλ€.)
본격μ μΌλ‘ C μμ€μ½λλ₯Ό μμ±νκΈ° μ΄μ μ
μμ±λ νλ‘μ νΈμ μμ±μ λ³κ²½ν΄μΌ νλ€.
νλ‘μ νΈ κΈ°λ³Έκ° - ꡬμ±νμμ λμ λΌμ΄λΈλ¬λ¦¬λ‘ λ°κΎΈκ³
μΌλ° - λμ νμ₯λͺ
λ λμ λΌμ΄λΈλ¬λ¦¬λ‘ λ³κ²½ν΄μΌ νλ€.
λλΆμ΄ μΈλΆ λΌμ΄λΈλ¬λ¦¬ μ€μ μ ν΅ν΄ μ°κ²°ν jdkλ₯Ό μ€μ ν΄μΌ νλ€.
μλμμ±λ ν€λνμΌμ μ μΈλμ΄ μλ ν¨μλ₯Ό C μΈμ΄λ‘ λ€μκ³Ό κ°μ΄ μ½λ©νλ€.
JNIEXPORT void JNICALL Java_simple_Hello_getHello(JNIEnv *env, jobject obj){
printf("Hello JNI\n");
return;
}
Java νλ‘μ νΈλ‘ λμμ Hello ν΄λμ€λ₯Ό μ€νν΄λ³Έλ€.
Console μ°½μ "Hello JNI"κ° λ³΄μ΄λ©΄ μ±κ³΅μ΄λ€.
μ€ν μ μ°¨λ₯Ό λμννλ©΄ λ€μκ³Ό κ°λ€
νμ¬ ν¬μ€ν
μ JNIμ λν λ§€μ° κ°λ¨ν μμ μ΄λ€.
λ€μ ν¬μ€ν
μ λ€μν λ°μ΄ν° νμ
μ λν JNI νμ©μ λν΄ μμ±μμ
exit()