티스토리 뷰

자바와 C/C++은 내부적으로 배열을 이용하는 구조가 다르다.

C/C++은 배열이 메모리 상에서 연속적으로 배치되는데 비해, Java의 경우 반드시 연속적으로 배치돼 있지는 않다.

 

이런 저런 연유로, Java와 C/C++의 배열은 서로 다르기 때문에, C/C++에서 자바의 배열을 사용하려면 반드시 변환을 해야 한다.

 

C/C++에서 접근 할 수 있는 자바의 배열을 가져오려면 Get[Type]ArrayElement를 사용하며, C/C++에서 자바의 배열에 접근 할 수 있는 배열의 포인터를 반환한다.

 

중요한 것은, 위의 함수를 이용해 확보한 메모리 영역은, 사용 후 반드시 Release[Type]ArrayElements 함수를 이용해 해제해야 한다는 것이다.

// 새로운 int[10] 배열 생성
jintArray arr = (*env)->NewIntArray(env, 10);
// 배열의 길이 구하기
int length = (*env)->GetArrayLength(env, arr);
// C 배열로 변환
jint* arrList = (*env)->GetIntArrayElements(env, arr, NULL);

..
..
..

// 자원 해제
(*env)->ReleaseIntArrayElements(env, arr, arrayList, 0);
// 4번째 인자가 무엇을 의미하는지는 잘 모르겠다. JNI_COMMIT 이라는데.. 뭔지 잘..

 

위의 경우 jint* arrList를 사용하여 배열로 쓰면 되겠다.

배열을 왜 포인터로 받는지 이해가 안되면 [C++] 2차원 배열의 포인터. 배열은 포인터 상수다. 글을 참조하기 바란다.

 

p.s) 왜 자꾸 JNI 함수에는 첫번째 인자로 env를 넣는건지 문득 궁금하다.. 어짜피 (*env)로 부터 호출하는 펑션 포인터면서...

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함