자바와 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)로 부터 호출하는 펑션 포인터면서...

 

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

roter

JHB / Peripheral Programmer

댓글을 달아 주세요

  • helloworld 2015.12.03 13:11 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 검색중에 들르게 되었네요.
    저는 지금 안드로이드스튜디오에서 ndk를 사용해 작은 프로젝트를 생각중인 학생입니다.
    sdk는 이럭저럭 자료도 많고 잘 사용해왔는데. ndk는 검색을 해봐도 자료도 별로 없고. 공부하는데 어려움이 많네요ㅠㅠ
    페이지 구경하던중에 보기 쉽게 설명하시고 . 잘 봐서 댓글 남겨봅니다.
    혹시 어떤책을 보시는지. 혹은 어느사이트에서 정보를 얻는다던지 하는걸 알 수 있을까요? 좀 알려주세요ㅠㅠ

    • BlogIcon roter 2015.12.20 22:03 신고  댓글주소  수정/삭제

      안녕하세요~ 방문해 주셔서 감사합니다 :)
      NDK 관련 책이 참 없죠...
      저도 한 4~5권 읽어 본 것 같은데 뭔가 내용이 다 거기서 거기더라구요..
      저도 이 책 저 책 짜집기 한 내용이라..ㅠㅠ 딱히 뭔가 추천해 드리기가 애매하네요..

  • NB 2016.05.25 11:16 신고  댓글주소  수정/삭제  댓글쓰기

    저 env라는 포인터를 static한 클래스로 활용한다면 펑션 포인터에 그 인자를 넘겨줄 필요가 없습니다.

    (함수에서 전역변수 env를 갖다 쓰면 되니까요)

    하지만, env라는 변수가 static 클래스가 아닌경우(즉, 여러개의 인스턴스가 만들어질 수 없는 경우)

    c에서는 메소드 콜을 할 때 현재 콜한 클래스가 뭔지 모르기 때문에 인자로 넘겨줘야 합니다.


    한번 C언어로 클래스와 같은 동작을 구현해 보시는 것도 괜찮을 듯 합니다.