타입 선언

자바에서 건네받은 변수를 C/C++에서 사용할 때, 자바에서 선언한 변수 타입에 따라 C/C++에서 변수를 사용하는 방법이 달라진다.

일반적으로 Java에서 사용하는 원시타입 앞에 j 를 붙이며, 배열의 경우 뒤에 Array를 붙인다.

 

 Java

JNI(C/C++)

 JNI(C/C++ 배열)

 boolean

jboolean

jbooleanArray

 byte

jbyte

jbyteArray

 char

jchar

jcharArray

 short

jshort

jshortArray

 int

jint

jintArray

 long

jlong

jlongArray

 float

jfloat

jfloatArray

 double

jdouble

jdoubleArray

 object

jobject

jobjectArray

 void

void 

 

 

시그니쳐

 

long foo(int n, String s, int[] arr); 을 signature 형태로 표시하면 다음과 같다.

(ILjava/lang/String;[I)J

시그니쳐를 해석해보면, J를 리턴하고, 인자는 I와 LJava/lang/String;과 [I 다.

이를 한번 더 해석하면 long을 리턴하고 인자는 int와 String과 int[]다.

 

그냥 JNI를 대충 따라하려 했을때, 가장 이해가 안되고 어려웠던게 바로 이 '시그니쳐' 였다.

시그니쳐는 호출하는 메소드명, 인수, 반환값을 말하며, 이를 지정하여 유일한 값을 만들때 사용한다.

원시타입알파벳 한글자로 표시한다. 예를 들어 byte는 B, boolean은 Z로 표시한다.(하단 테이블 설명)

클래스는 앞에는 L을, 끝에는 세미콜론(;)을 붙이고 클래스명을 쓸 땐 패키지명을 포함하여 FULL로 적는다.(fully-qualified-class라 한다) 이 때 패키지명의 .은 /로 대체하여 작성한다. 예를 들어 자바의 String타입은 Ljava/lang/String; 으로 표시한다.

배열은 앞에 [를 붙여서 표시한다. 예를 들어 int[]는 [I; 이다.(대문자 아이)

 

Java Type

Type Signature

boolean

Z

byte

B

char

C

short

S

int

I

long

J

float

F

double

D

 void

fully-qualified-class

Lfully-qualified-class

 배열

[Type 

리턴 타입 함수명 (인자)

 (인자)리턴 타입

 

 

byte, char, short, int, float, double은 각각의 앞글자라 외우기 쉽지만.. boolean, long은 예외다.

 

 

상세한 설명은 https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/types.html를 참조하기 바란다.

저작자 표시 비영리 변경 금지
신고
블로그 이미지

roter

JHB / Peripheral Programmer

댓글을 달아 주세요