JNI C++ 오브젝트 처리하기

JNI C++ 오브젝트 처리하기

지난번에는 간단하게 void와 String을 처리해보았다.

하지만 필드가 20개되는 구조체를 형태를 주고 받을려니 아무래도 Object 형태가 필요하다.

1. 일단 기존의 구조체를 java 클래스로 변경하자.
다음과 같이 간단한 구조체를 사용해보자.

User.java

2. jni에서 User을 인수를 가지는 add 메소드를 추가하자
Dailyon.java

 

3. 이전과 비슷한 형태로 main class를 구현하자.
JNITest.java

 

4. header 파일 생성
javah jni.Dailyon 으로 header 파일을 생성하면 다음과 같이 Java_jni_Dailyon_add 구현되어 있다.
함수명은 패키지명 포함되어 있음을 주의하자.

5. c++ 구현
jni_Dailyon.cpp

 

항상 패턴은 GetFieldID, Get****Field 가져오면된다.
GetFieldID 3번째 인수는 signature인데 다음과 같다.
대소문자를 구분하고, long 인 경우 J임에 유의하자.
자세한 시그니처는 아래 표를 참조하자.

Java VM Type Signatures

Type Signature

Java Type

Z

boolean

B

byte

C

char

S

short

I

int

J

long

F

float

D

double

L fully-qualified-class ;

fully-qualified-class

[ type

type[]

( arg-types ) ret-type

method type

For example, the Java method:

long f (int n, String s, int[] arr);

has the following type signature:

(ILjava/lang/String;[I)J

레퍼런스: http://download.oracle.com/javase/1.5.0/docs/guide/jni/spec/types.html#wp9502

클래스인 경우에는 javap -s 클래스명으로 찾을 수 있다.
javap -s java.lang.StringBuilder

FieldID를 가져왔으면, 해당되는 객체에 따라서 Get*****Field를 사용하자.
GetObjectField,
GetBooleanField,
GetByteField,
GetCharField,
GetShortField,
GetIntField,
GetLongField,
GetFloatField,
GetDoubleField,
당연히 Set*****Field 메소드도 존재한다.
SetObjectField,
SetBooleanField,
SetByteField,
SetCharField,
SetShortField,
SetIntField,
SetLongField,
SetFloatField,
SetDoubleField,
추가로 배열을 가져올때 아래를 참조하자.
레퍼런스:
http://jetzt.tistory.com/365
http://download.oracle.com/javase/6/docs/technotes/guides/jni/spec/functions.html#wp23720

<표 4> 배열을 다루기 위한 JNI의 GetArrayElements 함수
JNI 함수
리턴타입
자바 배열 타입
GetBooleanArrayElements()
jboolean *
boolean[]
GetByteArrayElements()
jbyte *
byte[]
GetCharArrayElements()
jchar *
char[]
GetShortArrayElements()
jshort *
short[]
GetIntArrayElements()
jint *
int[]
GetLongArrayElements()
jlong *
long[]
GetFloatArrayElements()
jfloat *
float[]
GetDoubleArrayElements()
jdouble *
double[]

[table id=1 alternating_row_colors= false column_widths=”40px|50px|80px|40px” /]

<표 5> 배열을 다루기 위한 JNI의 ReleaseArrayElements 함수
JNI 함수
네이티브 배열 타입
자바 배열 타입
ReleaseBooleanArrayElements()
jboolean *
boolean[]
ReleaseByteArrayElements()
jbyte *
byte[]
ReleaseCharArrayElements()
jchar *
char[]
ReleaseShortArrayElements()
jshort *
short[]
ReleaseIntArrayElements()
jint *
int[]
ReleaseLongArrayElements()
jlong *
long[]
ReleaseFloatArrayElements()
jfloat *
float[]
ReleaseDoubleArrayElements()
jdouble *
double[]
<표 1> JNI에서 사용하는 데이터 타입과 범위
Java
C(JNI)
비트수
C/C++(Win32)
boolean
jboolean
8 unsigned
unsigned char
byte
jbyte
8
unsigned char
char
jchar
16 unsigned
unsigned short
short
jshort
16
short
int
jint
32
int
long
jlong
64
_int64 (비주얼C++)
float
jfloat
32
float
double
jdouble
64
double
void
void
void

Leave a Reply

Your email address will not be published. Required fields are marked *