티스토리 뷰
자바와 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] 배열 사용하기 (3) | 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의 변수 타입과 시그니처 (0) | 2015.09.18 |
댓글
-
helloworld
안녕하세요 검색중에 들르게 되었네요.
저는 지금 안드로이드스튜디오에서 ndk를 사용해 작은 프로젝트를 생각중인 학생입니다.
sdk는 이럭저럭 자료도 많고 잘 사용해왔는데. ndk는 검색을 해봐도 자료도 별로 없고. 공부하는데 어려움이 많네요ㅠㅠ
페이지 구경하던중에 보기 쉽게 설명하시고 . 잘 봐서 댓글 남겨봅니다.
혹시 어떤책을 보시는지. 혹은 어느사이트에서 정보를 얻는다던지 하는걸 알 수 있을까요? 좀 알려주세요ㅠㅠ
2015.12.03 13:11 -
jhbaek 안녕하세요~ 방문해 주셔서 감사합니다 :)
NDK 관련 책이 참 없죠...
저도 한 4~5권 읽어 본 것 같은데 뭔가 내용이 다 거기서 거기더라구요..
저도 이 책 저 책 짜집기 한 내용이라..ㅠㅠ 딱히 뭔가 추천해 드리기가 애매하네요.. 2015.12.20 22:03 신고 -
NB
저 env라는 포인터를 static한 클래스로 활용한다면 펑션 포인터에 그 인자를 넘겨줄 필요가 없습니다.
(함수에서 전역변수 env를 갖다 쓰면 되니까요)
하지만, env라는 변수가 static 클래스가 아닌경우(즉, 여러개의 인스턴스가 만들어질 수 없는 경우)
c에서는 메소드 콜을 할 때 현재 콜한 클래스가 뭔지 모르기 때문에 인자로 넘겨줘야 합니다.
한번 C언어로 클래스와 같은 동작을 구현해 보시는 것도 괜찮을 듯 합니다.
2016.05.25 11:16
공지사항
- Total
- 823,463
- Today
- 0
- Yesterday
- 147
TAG
- MFC
- linux
- jni
- database
- 프로그래밍
- jni강좌
- winapi
- 음악
- source
- db
- Visual C++
- AWS
- C++
- Cloud
- API
- android
- kering
- java
- NDK
- it
- Python
- 안드로이드
- gcc
- 리눅스
- Troubleshooting
- driver
- 드라이버
- algorithm
- Quiz
- C