티스토리 뷰
자바와 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)로 부터 호출하는 펑션 포인터면서...
'Development > Mobile' 카테고리의 다른 글
[Android] NotificationListnerService 완벽 예제 (0) | 2015.11.29 |
---|---|
[Android] Service 실행 여부 파악하기 (0) | 2015.11.29 |
[Android] Android System Application (기본 설치앱) 지우기 (0) | 2015.11.29 |
[Android JNI/NDK] 로그 출력 (0) | 2015.09.21 |
[Android JNI/NDK] C/C++에서 Java 함수 호출 하기 / 멤버 변수 사용하기 (0) | 2015.09.21 |
[Android JNI/NDK] JNI를 이용해 Java에서 C 함수 호출하기 (0) | 2015.09.21 |
[Android JNI/NDK] JNI에서 C와 C++의 차이 (0) | 2015.09.18 |
[Android JNI/NDK] JNI의 변수 타입과 시그니처 (1) | 2015.09.18 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- java
- 안드로이드
- 음악
- NDK
- API
- AWS
- Visual C++
- Cloud
- C++
- C
- 프로그래밍
- kering
- driver
- MFC
- linux
- gcc
- jni강좌
- algorithm
- Troubleshooting
- source
- db
- it
- Quiz
- jni
- android
- winapi
- database
- 리눅스
- 드라이버
- Python
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함