티스토리 뷰

1. JNI 변수 타입


JNI 변수 타입은 Java의 변수를 C++/C 에서 사용 할수 있게끔 호환해주는 변수 타입이다. 

jni.h를 인클루드하면 사용이 가능한데 자세한 정보는 아래의 표를 보면 알 수 있다.



JAVA 

C++/C 

C++/C 배열 

boolean

jboolean 

jbooleanArray 

byte

jbyte 

jbytArray

char 

jchar 

jcharArray 

short 

jshort 

jshortArray 

int 

jint 

jintArray 

long

jlong 

jlongArray 

float 

jfloat 

jfloatArray 

void 

jvoid 

jvoidArray 

Object 

jobject 

jobjectArray 

String 

jstring 

jstringArray 


java의 기본 변수형은 c++/c언어에서는 j가 붙은 클래스로 제공된다. int -> jint로 객체를 선언해서 사용해주면 되고, 배열도 마찬가지로 j+자료형+Array 객체형태로 생성해서 사용하면 된다.



c++ 에서의 사용 예


void main() {     jstring str;     jint num;     jobject obj;     ... }




2. JNI 시그니처

JNI 시그니처를 사용하는 이유는 JAVA에서 생성한 클래스나 함수에 접근하기위해 C++/C에서 사용하는 구분자라고 보면 된다. 


시그니처 

Type 

byte 

char 

double 

float 

int 

long 

short 

void 

boolean 

L클래스_이름 

패키지 경로/ 클래스 이름 

[ type 

type[] 배열 


public class aa {
	public int testInt(int a) {return a;}
	public String testString(String a) {return a;}
}


위와같은 java 소스에서 aa클래스 안에는 int testint(int) 메서드와 String testString(String) 메서드가 있다.

c++에서 위의 메서드를 콜하기 위해서는 아래와 같은 문법으로 접근해야한다.



void main() {
	jclass cls = (*env)->GetObjectClass(env, obj);
	jmethodID testInt = (*env)->GetMethodID(env, cls, "testInt", "(I)I");
	jint jnum = (*env)->CallIntMethod(env, obj, testInt, num);

	jmethodID testString = (*env)->GetMethodID(env, cls, "testString", "(Ljava.lang.String;)Ljava.lang.String;");
	jstring jstr = (*env)->CallObjectMethod(env, obj, testString, str);
}


GetMethodID()를 이용하여 java함수를 콜할수 있는데 JvmEnv, jclass, "함수명", 시그니처가 매개변수로 들어간다. aa클래스를 담고있는 jclass와 함게 함수명 "testInt" 그리고 시그니처 (I)I 를 넣어줘야 위의 Java에서 생성한  int testInt(int)를 가져올 수 있다.

String 형 같은 경우에는 기본 변수타입이 아니기때문에 Object형식으로 접근해야한다. Ljava.lang.String;으로 시그니처를 입력해야하는데 주의할 점은 ; 세미클론을 빼먹을 경우 인식을 하지 못한다. 이점 유의해서 사용하길 바란다.


String형과같은 Object형을 함수에서 return시키거나 input시킬때에는 해당 클래스의 임포트 경로를 입력해주면된다. 간단하져?