NDK는 C나 C++같은 네이티브 코드 언어를 사용하여 응용 프로그램의 일부를 구현할 수 있도록 하고, 기존 코드를 재사용 할 수 있도록 제공하는 하나의 개발 툴 킷이다. C/C++의 좋은 어플리케이션을 활용할수도 있고 자바에서 처리하지 않고 C/C++에서 처리할 수 있는 장점을 가졌다. 


NDK란 무엇인가?

NDK (Native Development Kit) 의 약자다.

쉽게 말해 java보다 네이티브한 영역인 C 영역에서 프로그래밍을 하는것을 말한다.

기본적으로 C와 java를 JNI 라는 인터페이스를 통해서 연결을 하는것이다. 


흔히들 자바를 해보지 않은 개발자들은 이런 말을 한다.

"야. C만 가지고는 안드로이드 개발 못하냐?"

일단 결론부터 얘기하면 "가능하다" 이다.

바로 위에서 얘기했던 NDK를 가지고다.

하지만 몇가지 제약조건이 있다.

일단 안드로이드의 기본 Window인 activity를 만들기 위해서는 

#include <android/native_activity.h>

이 해더파일을 인클루드 해야 하는데 저 해더파일은 안드로이드 2.3부터 지원한다.

한마디로 완벽하게 C/C++을 가지고 안드로이드 프로그래밍을 하려면 2.3이상의 단말에서만 가능하다 ㅎㅎ;

참고로 opengl es 1.x는 1.6이상의 버전에서 2.x는 2.0 이상의 단말에서 지원을 한다.

한마디로 하위버전을 고려하지 않을거면 C로 짜세요. 가 맞을지도 ㅎㅎ;;


그리고 메모리에 대한 문제도 있다.

안드로이드의 메모리 영역은 쉽게 두가지로 나눌 수 있는다. 

자바의 allocation heap과 C에서 사용하는 native heap 이 이것이다.


안드로이드 개발자가 대부분 많이 격는 문제가 하나가 있는데 이미지를 불러오다 보면 OutofMemory를 많이 볼것이다.

그럼 기존 자바만 개발하던 개발자들은 하나같이 이런 말은 한다... "왜? 메모리가 이렇게 많은데? 왜?"


그건 바로 native heap이 부족해서이다. 안드로이드는 기본적으로 이미지같은 (Bitmap, Drawable 등) 걸 사용할때 native heap을 사용한다.

자바 영역에 heap이 아무리 남아 돌아도 native heap이 부족하면 바로 out of memory Exception이 난다. ;; 헐~


실제로 Drawable 안에는 Bitmap이 들어있고 Bitmap은 내부적으로 Skia 라는 라이브러리를 사용하고 이것은 native 영역으로 되어 있다.

(스키아가 궁금하면 받아서 확인해 볼것... git clone git://android.git.kernel.org/platform/external/skia.git)

한마디로 어디서 이미지를 사용하든지 간에 안드로이드에서 이미지를 사용하게 되면 native heap을 자신도 모르게 할당을 받아서 사용한다.

그래서 Bitmap 클레스에는 recycle() 이란 함수가 존재하는데 이 녀석에 역할은 native로 할당된 이미지 메모리 영역을 바로 free 시켜주는 역할을 한다.

한마디로 자바에서도 C처럼 메모리를 릴리즈 시켜줄수 있다는 얘기다. 


native heap 역시 자바의 vm heapsize 를 따르기때문에 heapsize 30m 라면 native heap도 30m까지밖에 할당을 하지 못한다. 

아까도 얘기했지만 30m를 vm의 heap과 나누어 쓰는것이 아니고 영역자체가 틀리기 때문에 각 각 30m 의 heap 생긴다고 생각하면 된다.


실제로 개발을 하면서 java의 heap이 부족해서 죽는 경우는 매우 드물다. 신경을 써야 할 부분은 바로 native heap이 중요하다.

아이폰에 경우에는 디바이스가 허용하는 범위라는 제약이 따르지만 안드로이드는 아이폰과 다르게 아무리 native라 하더라도 maxium heap 이 존재하기 때문에 큰 이미지를 불러온다던지, 이미지를 계속 불러오다보면 언젠가는 죽는다... 이런!!!

그래서 게임개발에 매우 취약하여 아이폰에 비해 게임이 많이 개발이 되지 않는 이유가 그래서이다. ㅠㅠ

 

기술이 발전하면서 안드로이드 단말의 heapsize도 계속 증가하지만. 그래도 아직까지는 개발자가 고심을 하면서 개발해야 하는 부분에 대해선 변함이 없다

[출처] [Android] 안드로이드에 완벽하지 않은 네이티브....|작성자 개발자


+ Recent posts